class Base create
class Child create
class Child destroy
class Base destroy
Дебагером нашел, что "падает" потому, что в функцию delete передается неправильный pHead, точнее вообще какой-то "левый".
Кто-нибудь сталкивался с таким поведением, или я неправильно предположил, что по delete this можно удалить дочерний класс (хотя, если судить по вызываемым деструкторам — все работает как и задумывалось)
class Base create
T>class Child create
T>class Child destroy
T>class Base destroy
T>Дебагером нашел, что "падает" потому, что в функцию delete передается неправильный pHead, точнее вообще какой-то "левый". T>Кто-нибудь сталкивался с таким поведением, или я неправильно предположил, что по delete this можно удалить дочерний класс (хотя, если судить по вызываемым деструкторам — все работает как и задумывалось)
Во втором случае объект удалается дважды! Первый раз в вашем коде
pClass.Destroy();
и второй раз "компилятором" при выходе из функции main.
Так что все верно....
WBR — Yuriy
Re[2]: VS7.1 Программа "падает" при удалении класса.
Здравствуйте, Tujh, Вы писали:
D>> и второй раз "компилятором" при выходе из функции main. D>>Так что все верно.... T>Точно, не подумал об этом. Огромное спасибо !
заюзайте инплэйс конструктор, и во втопром случае падать не будет)
Re: VS7.1 Программа "падает" при удалении класса.
От:
Аноним
Дата:
22.09.07 16:34
Оценка:
Здравствуйте, Tujh, Вы писали:
T>Дебагером нашел, что "падает" потому, что в функцию delete передается неправильный pHead, точнее вообще какой-то "левый". T>Кто-нибудь сталкивался с таким поведением, или я неправильно предположил, что по delete this можно удалить дочерний класс (хотя, если судить по вызываемым деструкторам — все работает как и задумывалось)
Нельзя удалять объект выделенный на стеке через delete.
Re[2]: VS7.1 Программа "падает" при удалении класса.
Здравствуйте, den123, Вы писали:
D>Во втором случае объект удалается дважды! Первый раз в вашем коде D>
D>pClass.Destroy();
D>
D> и второй раз "компилятором" при выходе из функции main.
На самом деле проблема возникает еще раньше: в строке
pClass.Destroy();
Дело в том, что выражение 'delete this' сначала вызывет деструктор, а потом попытается освободить память посредством вызова operator delete. Потому как память для объекта выделена на стеке, попытка ее освобождения через operator delete приведет к UB.
Если тебе действительно необходимо удалять классы через Destoy(), можешь сделать так:
class Base
{
public:
void Destroy() { this->~Base(); }
private:
~Base() { }
};
Закрытый конструктор не позволит создать объект на стеке, 'this->~Base()' вместо 'delete this' позволяет корректно создавать объект через placement new.
T>Кто-нибудь сталкивался с таким поведением, или я неправильно предположил, что по delete this можно удалить дочерний класс (хотя, если судить по вызываемым деструкторам — все работает как и задумывалось)
Правило простое: удаляй с помощью delete ([]) только то, что выделил с помощью new ([]).
Здравствуйте, Андрей Коростелев, Вы писали:
АК>Если тебе действительно необходимо удалять классы через Destoy(), можешь сделать так:
АК>Закрытый конструктор не позволит создать объект на стеке, 'this->~Base()' вместо 'delete this' позволяет корректно создавать объект через placement new.
Это всё, конечно, очень интересно, и правильно, но, возможно, не совсем доступно топикстартеру
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, Андрей Коростелев, Вы писали:
АК>>Если тебе действительно необходимо удалять классы через Destoy(), можешь сделать так:
АК>>Закрытый конструктор не позволит создать объект на стеке, 'this->~Base()' вместо 'delete this' позволяет корректно создавать объект через placement new.
E>Это всё, конечно, очень интересно, и правильно, но, возможно, не совсем доступно топикстартеру
И что ты предлагаешь? Не объяснять, а постать топикстартера читать страуструпа (или стандарт) до поси... тьфу осознания?
Это, конечно, правильно (так и надо ), но как-то грубо .