Операторы new и delete в MFC
От: Gorik Россия  
Дата: 27.01.02 23:54
Оценка:
Сам не думал, что могут возникнуть проблемы на этой почве, но...
По идее, при использовании delete должен вызываться деструктор объекта, а затем очищатся логическая память. Я унаследовал класс от CObject, но по delete вываливается ASSERT в дебаге, а в релизе, как и следует, выполняет недопустимую операцию.
При трассировке в деструктор не заходит.
Фарш невозможно провернуть назад (с)Второе начало термодинамики
Re: Операторы new и delete в MFC
От: Vampire Россия  
Дата: 28.01.02 05:56
Оценка:
Здравствуйте Gorik, Вы писали:

G>Сам не думал, что могут возникнуть проблемы на этой почве, но...

G>По идее, при использовании delete должен вызываться деструктор объекта, а затем очищатся логическая память. Я унаследовал класс от CObject, но по delete вываливается ASSERT в дебаге, а в релизе, как и следует, выполняет недопустимую операцию.
G>При трассировке в деструктор не заходит.

Было что-то подобное ! Приведи код (выделение и освобождение, что стоит до и после delete)
Есть фича с CFileException я еще не разу ему delete не смог сделать, ни до CFile не после
Если долго мучиться что нибудь получится
Re: Операторы new и delete в MFC
От: Krom Россия  
Дата: 28.01.02 10:17
Оценка:
Здравствуйте Gorik, Вы писали:

G>Сам не думал, что могут возникнуть проблемы на этой почве, но...

G>По идее, при использовании delete должен вызываться деструктор объекта, а затем очищатся логическая память. Я унаследовал класс от CObject, но по delete вываливается ASSERT в дебаге, а в релизе, как и следует, выполняет недопустимую операцию.
G>При трассировке в деструктор не заходит.

Я бы рекомендовал сначала посмотреть какой адресс в указателе хранится, скорее всего на несуществующего объекта.
Надо трассировать delete.
Best regards
Krom
Re: Операторы new и delete в MFC
От: Gorik Россия  
Дата: 28.01.02 16:57
Оценка:
Спасибо всем, но время даетответ на любые вопросы.
Я всю дизнь пребывал в уверенности, что приведение типа указателя на потомок к указателю на предка класса является простой формальностью, и значение при этом сохраняется. Увы, это не так, я создавал экземпляр потомка, а убивал базовый, что и повлекло бедствия вселенского масштаба.
С кем не бывает!
Всем спасибо.
Фарш невозможно провернуть назад (с)Второе начало термодинамики
Re[2]: Операторы new и delete в MFC
От: Sasparella США  
Дата: 28.01.02 20:48
Оценка:
Здравствуйте Gorik, Вы писали:

G>Спасибо всем, но время даетответ на любые вопросы.

G>Я всю дизнь пребывал в уверенности, что приведение типа указателя на потомок к указателю на предка класса является простой формальностью, и значение при этом сохраняется. Увы, это не так, я создавал экземпляр потомка, а убивал базовый, что и повлекло бедствия вселенского масштаба.
G> С кем не бывает!
G> Всем спасибо.


Может я глючу — но что это тогда получается — если

class a{};
class b: public a {};


то


a *p= (a*) new b;
delete p;


делать нельзя????

Тогдаж полиморфизм к чертям летит....

Саша.
Re[3]: Операторы new и delete в MFC
От: Alex Fedotov США  
Дата: 28.01.02 20:51
Оценка:
Здравствуйте Sasparella, Вы писали:

S>Может я глючу — но что это тогда получается — если


S>
S>class a{};
S>class b: public a {};

S>


S>то


S>

S>a *p= (a*) new b;
S>delete p;

S>


S>делать нельзя????


S>Тогдаж полиморфизм к чертям летит....


Можно, если деструктор виртуальный.
-- Alex Fedotov
Re[4]: Операторы new и delete в MFC
От: Saddam Россия http://saddam.narod.ru
Дата: 29.01.02 08:10
Оценка:
Здравствуйте Alex Fedotov, Вы писали:

S>>Может я глючу — но что это тогда получается — если


S>>
S>>class a{};
S>>class b: public a {};

S>>


S>>то


S>>

S>>a *p= (a*) new b;
S>>delete p;

S>>


S>>делать нельзя????


S>>Тогдаж полиморфизм к чертям летит....


AF>Можно, если деструктор виртуальный.

Строго говоря — у тебя не вызовется деструктор потомка. Т.о., если ты динамически не выделяешь чего-либо, или сразу это "чего-либо" чистишь — то мона вызвать и деструктор предка. ИМХО.
- Вы знаете — жаль, просто по-человечески жаль Памелу Андерсон, которая никогда не сможет сыграть на баяне...
Re[3]: Операторы new и delete в MFC
От: Dr_Sh0ck Беларусь  
Дата: 29.01.02 11:40
Оценка:
Здравствуйте Sasparella, Вы писали:

S>Здравствуйте Gorik, Вы писали:


G>>Спасибо всем, но время даетответ на любые вопросы.

G>>Я всю дизнь пребывал в уверенности, что приведение типа указателя на потомок к указателю на предка класса является простой формальностью, и значение при этом сохраняется. Увы, это не так, я создавал экземпляр потомка, а убивал базовый, что и повлекло бедствия вселенского масштаба.
G>> С кем не бывает!
G>> Всем спасибо.


S>Может я глючу — но что это тогда получается — если


S>
S>class a{};
S>class b: public a {};

S>


S>то


S>

S>a *p= (a*) new b;
S>delete p;

S>


S>делать нельзя????


S>Тогдаж полиморфизм к чертям летит....


S>Саша.


Так делать можно и даже иногда нужно, только деструктор в а должен быть виртуальный
Do not fake yourself ;)
ICQ#: 198114726
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.