Что тут неправильного?
Правила форума
Пожалуйста, ознакомьтесь с правилами данного форума
Пожалуйста, ознакомьтесь с правилами данного форума
-
- Маньяк
- Сообщения: 1510
- Зарегистрирован: 26 фев 2006, 10:00
- Откуда: offline
Что тут неправильного?
struct MStruct
{
int *ptr;
MStruct(int n) { ptr = new int; *ptr = n; }
~MStruct() { delete ptr; }
};
{
int *ptr;
MStruct(int n) { ptr = new int; *ptr = n; }
~MStruct() { delete ptr; }
};
- dima
- Житель
- Сообщения: 690
- Зарегистрирован: 19 фев 2003, 19:26
- Откуда: Хабаровск->Toronto
Re: Что тут неправильного?
1. default constructor не определен, поэтому destructor упадет с сигналомtiasur писал(а):struct MStruct
{
int *ptr;
MStruct(int n) { ptr = new int; *ptr = n; }
~MStruct() { delete ptr; }
};
2. copy constructor не определен - скопируется мусор, destructor упадет
- aissp
- Маньяк
- Сообщения: 2710
- Зарегистрирован: 07 ноя 2005, 09:51
Краткий ответ, если память не выделилась то присваивание *ptr = n ведет к краху.
О прокоментирую предыдущего оратора.
1. не согласный я
Myclass qq(5); ....
попытки сделать что-либо другое вызовут ошиППку компиляции что есть карошо
2. Тут да проблема
{
Myclass qq(5);
{
Myclass qq1(qq); //or qq1=qq; почленное копирование тут
}
//here we have got a some trouble s=)
}
О прокоментирую предыдущего оратора.
1. не согласный я
Myclass qq(5); ....
попытки сделать что-либо другое вызовут ошиППку компиляции что есть карошо
2. Тут да проблема
{
Myclass qq(5);
{
Myclass qq1(qq); //or qq1=qq; почленное копирование тут
}
//here we have got a some trouble s=)
}
-
- Маньяк
- Сообщения: 1510
- Зарегистрирован: 26 фев 2006, 10:00
- Откуда: offline
Ничего не падает:
Код: Выделить всё
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
- aissp
- Маньяк
- Сообщения: 2710
- Зарегистрирован: 07 ноя 2005, 09:51
-
- Маньяк
- Сообщения: 1510
- Зарегистрирован: 26 фев 2006, 10:00
- Откуда: offline
А чего тогда спрашиваеш?
Выдает ошибку когда в конце освобождаю память:
we havent resources so right now new return 0 (or some garbage and bad_alloc)
Мне кажется не в этом дело. Памяти в данном случае запрашивается не много и что-то подобное часто встречается.
Выдает ошибку когда в конце освобождаю память:
Код: Выделить всё
strMe.~MyStruct();
Мне кажется не в этом дело. Памяти в данном случае запрашивается не много и что-то подобное часто встречается.
- aissp
- Маньяк
- Сообщения: 2710
- Зарегистрирован: 07 ноя 2005, 09:51
А так ето практический вопрос? Ну конструктор я бы все равно переписал енсли уж есть явная необходимость хрнить так=)
Скорее всего связано с отсуствием конструктора копирования - где то ты передаешь структуру в функцию по значению, и соотвественно вызываешь два деструктора для одного и того же указателя
О майн гот, тока ща заметил. Ты вызывваешь деструктор в майне а структуру объявляешь глобально? После выхода из майна деструктор будет вызван опять. Ой, блин и еще добавлю, если определил ету фигню не в теле майна никто не гарантирует что в то время когда ты опрашиваешь указатель в майне он будет определен.
Скорее всего связано с отсуствием конструктора копирования - где то ты передаешь структуру в функцию по значению, и соотвественно вызываешь два деструктора для одного и того же указателя
О майн гот, тока ща заметил. Ты вызывваешь деструктор в майне а структуру объявляешь глобально? После выхода из майна деструктор будет вызван опять. Ой, блин и еще добавлю, если определил ету фигню не в теле майна никто не гарантирует что в то время когда ты опрашиваешь указатель в майне он будет определен.
-
- Маньяк
- Сообщения: 1510
- Зарегистрирован: 26 фев 2006, 10:00
- Откуда: offline
aissp
А так ето практический вопрос?
Да нет это задачки от Майкрософта. Наверно все-таки ты прав. Вот еще задачка:
Что не так? Я вижу только бессмысленность, так как в int a, b; будут случайные значения изменить которые нельзя.
А так ето практический вопрос?
Да нет это задачки от Майкрософта. Наверно все-таки ты прав. Вот еще задачка:
Код: Выделить всё
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;
}
- aissp
- Маньяк
- Сообщения: 2710
- Зарегистрирован: 07 ноя 2005, 09:51
Вообще то 0 там будут, благо инт (вот могу соврать но вроде еще помнб стандарт) обязан проинициализироваться нулем. В остальноя я проблем тут честно гря не вижу. Константа инициализируется в списке инициализации, в противном случае была бы ощибка компиляции, данный в функцию передаются по значению (опять же ошибка компиляции в противном случае). Сдаюсь я тут. Данный код в том виде в котором представлен обязан работать:)
Где ж тыт таких задач то набрал? =)
Где ж тыт таких задач то набрал? =)
-
- Маньяк
- Сообщения: 1510
- Зарегистрирован: 26 фев 2006, 10:00
- Откуда: offline
- aissp
- Маньяк
- Сообщения: 2710
- Зарегистрирован: 07 ноя 2005, 09:51
Ну значит стандарт не гарантирует или компилятор не удовлетворяет стандарту. Ну либо я дятел, что тоже вполне возможно.+)
Ну ты присылай если чего, хоть освежу в памяти то чем практически никогда не пользуюсь=)
О да я дятель, локальные объекты не имееют инициализации по умолчанию (таки взглянул в стандарт).
Ну ты присылай если чего, хоть освежу в памяти то чем практически никогда не пользуюсь=)
О да я дятель, локальные объекты не имееют инициализации по умолчанию (таки взглянул в стандарт).
-
- Маньяк
- Сообщения: 1510
- Зарегистрирован: 26 фев 2006, 10:00
- Откуда: offline
Я пробовал на VC++ 6.0aissp писал(а):Ну значит стандарт не гарантирует или компилятор не удовлетворяет стандарту. Ну либо я дятел, что тоже вполне возможно.+)
Да пожалуйста:Ну ты присылай если чего, хоть освежу в памяти то чем практически никогда не пользуюсь=)
Код: Выделить всё
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;
}
- sz
- Маньяк
- Сообщения: 1266
- Зарегистрирован: 17 фев 2003, 19:34
- sobomax
- Маньяк
- Сообщения: 3699
- Зарегистрирован: 29 июн 2006, 22:53
- Откуда: Vancouver
Во втором printf p[0] не был проинициилизирован до обращения к нему.tiasur писал(а):Да пожалуйста:
Tут помимо всеобшей тупизны ничего особенного не замечаю. Ну разве что memory leakage.Код: Выделить всё
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; }
-Maxim