Что тут неправильного?

Все, что вы хотели знать о программизме, но боялись спросить.
Ответить
tiasur
Маньяк
Сообщения: 1510
Зарегистрирован: 26 фев 2006, 10:00
Откуда: offline

Что тут неправильного?

Сообщение tiasur »

struct MStruct
{
int *ptr;
MStruct(int n) { ptr = new int; *ptr = n; }
~MStruct() { delete ptr; }
};
Аватара пользователя
dima
Житель
Сообщения: 690
Зарегистрирован: 19 фев 2003, 19:26
Откуда: Хабаровск->Toronto

Re: Что тут неправильного?

Сообщение dima »

tiasur писал(а):struct MStruct
{
int *ptr;
MStruct(int n) { ptr = new int; *ptr = n; }
~MStruct() { delete ptr; }
};
1. default constructor не определен, поэтому destructor упадет с сигналом
2. copy constructor не определен - скопируется мусор, destructor упадет
Аватара пользователя
aissp
Маньяк
Сообщения: 2710
Зарегистрирован: 07 ноя 2005, 09:51

Сообщение aissp »

Краткий ответ, если память не выделилась то присваивание *ptr = n ведет к краху.

О прокоментирую предыдущего оратора.

1. не согласный я
Myclass qq(5); ....

попытки сделать что-либо другое вызовут ошиППку компиляции что есть карошо

2. Тут да проблема
{
Myclass qq(5);
{
Myclass qq1(qq); //or qq1=qq; почленное копирование тут
}
//here we have got a some trouble s=)
}
tiasur
Маньяк
Сообщения: 1510
Зарегистрирован: 26 фев 2006, 10:00
Откуда: offline

Сообщение tiasur »

Ничего не падает:

Код: Выделить всё

struct MStruct
	{
            int *ptr;
            MStruct(int n) { ptr= new int; *ptr = n; }
	} strMe(10);  

void main()
{

	 printf( "%d\n", *strMe.ptr);  
	 while(1);
    
}
Аватара пользователя
sobomax
Маньяк
Сообщения: 3699
Зарегистрирован: 29 июн 2006, 22:53
Откуда: Vancouver

Сообщение sobomax »

tiasur писал(а):Ничего не падает:
А чего тогда спрашиваеш? :?:

-Maxim
Аватара пользователя
aissp
Маньяк
Сообщения: 2710
Зарегистрирован: 07 ноя 2005, 09:51

Сообщение aissp »

Ну как же

ptr = nrew int; //we havent resources so right now new return 0 (or some garbage and bad_alloc)
//if we got bad_alloc we get cored dump immediately in opposite case the next string is

*(0) = n; //with the same result
tiasur
Маньяк
Сообщения: 1510
Зарегистрирован: 26 фев 2006, 10:00
Откуда: offline

Сообщение tiasur »

А чего тогда спрашиваеш?
Выдает ошибку когда в конце освобождаю память:

Код: Выделить всё

strMe.~MyStruct();
we havent resources so right now new return 0 (or some garbage and bad_alloc)

Мне кажется не в этом дело. Памяти в данном случае запрашивается не много и что-то подобное часто встречается.
Аватара пользователя
aissp
Маньяк
Сообщения: 2710
Зарегистрирован: 07 ноя 2005, 09:51

Сообщение aissp »

А так ето практический вопрос? Ну конструктор я бы все равно переписал енсли уж есть явная необходимость хрнить так=)

Скорее всего связано с отсуствием конструктора копирования - где то ты передаешь структуру в функцию по значению, и соотвественно вызываешь два деструктора для одного и того же указателя

О майн гот, тока ща заметил. Ты вызывваешь деструктор в майне а структуру объявляешь глобально? После выхода из майна деструктор будет вызван опять. Ой, блин и еще добавлю, если определил ету фигню не в теле майна никто не гарантирует что в то время когда ты опрашиваешь указатель в майне он будет определен.
tiasur
Маньяк
Сообщения: 1510
Зарегистрирован: 26 фев 2006, 10:00
Откуда: offline

Сообщение tiasur »

aissp
А так ето практический вопрос?

Да нет это задачки от Майкрософта. Наверно все-таки ты прав. Вот еще задачка:

Код: Выделить всё

class A { public: int a, b; };
class B
{
      public:
      const A a;
      B() :a() { }
};

int main()
{
      B b;
      printf( "%d %d\n", b.a.a, b.a.b );
      return 0;
}
Что не так? Я вижу только бессмысленность, так как в int a, b; будут случайные значения изменить которые нельзя.
Аватара пользователя
aissp
Маньяк
Сообщения: 2710
Зарегистрирован: 07 ноя 2005, 09:51

Сообщение aissp »

Вообще то 0 там будут, благо инт (вот могу соврать но вроде еще помнб стандарт) обязан проинициализироваться нулем. В остальноя я проблем тут честно гря не вижу. Константа инициализируется в списке инициализации, в противном случае была бы ощибка компиляции, данный в функцию передаются по значению (опять же ошибка компиляции в противном случае). Сдаюсь я тут. Данный код в том виде в котором представлен обязан работать:)

Где ж тыт таких задач то набрал? =)
tiasur
Маньяк
Сообщения: 1510
Зарегистрирован: 26 фев 2006, 10:00
Откуда: offline

Сообщение tiasur »

aissp писал(а):Вообще то 0 там будут
У меня получается многозначное число, причем b.a.a = b.a.b
Где ж тыт таких задач то набрал? =)
Работодатели и их соратники присылают, хотя я почти и не программист.
Аватара пользователя
aissp
Маньяк
Сообщения: 2710
Зарегистрирован: 07 ноя 2005, 09:51

Сообщение aissp »

Ну значит стандарт не гарантирует или компилятор не удовлетворяет стандарту. Ну либо я дятел, что тоже вполне возможно.+)

Ну ты присылай если чего, хоть освежу в памяти то чем практически никогда не пользуюсь=)

О да я дятель, локальные объекты не имееют инициализации по умолчанию (таки взглянул в стандарт).
tiasur
Маньяк
Сообщения: 1510
Зарегистрирован: 26 фев 2006, 10:00
Откуда: offline

Сообщение tiasur »

aissp писал(а):Ну значит стандарт не гарантирует или компилятор не удовлетворяет стандарту. Ну либо я дятел, что тоже вполне возможно.+)
Я пробовал на VC++ 6.0
Ну ты присылай если чего, хоть освежу в памяти то чем практически никогда не пользуюсь=)
Да пожалуйста:

Код: Выделить всё

int *array(int n)
{
      return new int(n);
}

int main()
{
      int *p = array(10);
      for( int i = 0; i < 10; i++ )
      {
            p[i] = 0;
      }
      printf( "%d\n", p[0] );
     p = array(10);
     printf( "%d\n", p[0] );
      return 0;
}
Tут помимо всеобшей тупизны ничего особенного не замечаю. Ну разве что memory leakage.
Аватара пользователя
sz
Маньяк
Сообщения: 1266
Зарегистрирован: 17 фев 2003, 19:34

Сообщение sz »

aissp писал(а):Вообще то 0 там будут, благо инт (вот могу соврать но вроде еще помнб стандарт) обязан проинициализироваться нулем.
Обязан только для глобальных данных. На стеке никто никому ничего не обязан.
Аватара пользователя
sobomax
Маньяк
Сообщения: 3699
Зарегистрирован: 29 июн 2006, 22:53
Откуда: Vancouver

Сообщение sobomax »

tiasur писал(а):Да пожалуйста:

Код: Выделить всё

int *array(int n)
{
      return new int(n);
}

int main()
{
      int *p = array(10);
      for( int i = 0; i < 10; i++ )
      {
            p[i] = 0;
      }
      printf( "%d\n", p[0] );
     p = array(10);
     printf( "%d\n", p[0] );
      return 0;
}
Tут помимо всеобшей тупизны ничего особенного не замечаю. Ну разве что memory leakage.
Во втором printf p[0] не был проинициилизирован до обращения к нему.

-Maxim
Ответить