Сам не думал, что могут возникнуть проблемы на этой почве, но...
По идее, при использовании delete должен вызываться деструктор объекта, а затем очищатся логическая память. Я унаследовал класс от CObject, но по delete вываливается ASSERT в дебаге, а в релизе, как и следует, выполняет недопустимую операцию.
При трассировке в деструктор не заходит.
Фарш невозможно провернуть назад (с)Второе начало термодинамики
Здравствуйте Gorik, Вы писали:
G>Сам не думал, что могут возникнуть проблемы на этой почве, но... G>По идее, при использовании delete должен вызываться деструктор объекта, а затем очищатся логическая память. Я унаследовал класс от CObject, но по delete вываливается ASSERT в дебаге, а в релизе, как и следует, выполняет недопустимую операцию. G>При трассировке в деструктор не заходит.
Было что-то подобное ! Приведи код (выделение и освобождение, что стоит до и после delete)
Есть фича с CFileException я еще не разу ему delete не смог сделать, ни до CFile не после
Здравствуйте Gorik, Вы писали:
G>Сам не думал, что могут возникнуть проблемы на этой почве, но... G>По идее, при использовании delete должен вызываться деструктор объекта, а затем очищатся логическая память. Я унаследовал класс от CObject, но по delete вываливается ASSERT в дебаге, а в релизе, как и следует, выполняет недопустимую операцию. G>При трассировке в деструктор не заходит.
Я бы рекомендовал сначала посмотреть какой адресс в указателе хранится, скорее всего на несуществующего объекта.
Надо трассировать delete.
Спасибо всем, но время даетответ на любые вопросы.
Я всю дизнь пребывал в уверенности, что приведение типа указателя на потомок к указателю на предка класса является простой формальностью, и значение при этом сохраняется. Увы, это не так, я создавал экземпляр потомка, а убивал базовый, что и повлекло бедствия вселенского масштаба.
С кем не бывает!
Всем спасибо.
Фарш невозможно провернуть назад (с)Второе начало термодинамики
Здравствуйте Gorik, Вы писали:
G>Спасибо всем, но время даетответ на любые вопросы. G>Я всю дизнь пребывал в уверенности, что приведение типа указателя на потомок к указателю на предка класса является простой формальностью, и значение при этом сохраняется. Увы, это не так, я создавал экземпляр потомка, а убивал базовый, что и повлекло бедствия вселенского масштаба. G> С кем не бывает! G> Всем спасибо.
Может я глючу — но что это тогда получается — если
Здравствуйте 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>Можно, если деструктор виртуальный.
Строго говоря — у тебя не вызовется деструктор потомка. Т.о., если ты динамически не выделяешь чего-либо, или сразу это "чего-либо" чистишь — то мона вызвать и деструктор предка. ИМХО.
- Вы знаете — жаль, просто по-человечески жаль Памелу Андерсон, которая никогда не сможет сыграть на баяне...
Здравствуйте 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>Саша.
Так делать можно и даже иногда нужно, только деструктор в а должен быть виртуальный