Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Происходит это потому, что удаление производится через указатель на базовый класс и для вызова деструктора компилятор использует раннее связывание. Деструктор базового класса не может вызвать деструктор производного, потому что он о нем ничего не знает. В итоге часть памяти, выделенная под производный класс, безвозвратно теряется.
class B: public A {
char m_str[1000];
};
class B: public A {
std::string m_str;
};
A * pA = new B; delete pA;
B * pB = new B; delete pB;
Уточню: мы говорим о разрушении оператором delete объекта класса B через указатель на его базовый подобъект класса A, в случае если деструкторы A и B — невиртуальные.
A * pA = new B;
delete pA; // undefined behaviourclass Base {};
class Derived : public Base {};
Base* p = new Derived; // в этом нет никакого смысла
delete p; // так, соответственно, тоже никто делать не будет => виртуальный деструктор не нуженclass A {};
class B: public A {
char m_str[1000];
}
int main() {
A * pA = new B;
delete pA;
return EXIT_SUCCESS;
}
Основное правило: если у вас в классе присутствует хотя бы одна виртуальная функция, деструктор также следует сделать виртуальным.
А с чего вы взяли, что я 'ниасилил'?
кучу времени приходится тратить не на программирование, а на попытки подстроится под этот C++
infinite amounts of pain when they don't work (and anybody who tells me that STL and especially Boost are stable and portable is just so full of BS that it's not even funny)Переводим на русский: Я не понимаю как работают шаблоны, поэтому когда я что-то написал неправильно и мне вываливается одна ошибка на 2 страницы я паникую. Вывод: STL и Boost — BS.
inefficient abstracted programming models where two years down the road you notice that some abstraction wasn't very efficient, but now all your code depends on all the nice object models around it, and you cannot fix it without rewriting your app.Переводим на русский: Я не в курсе, что С++ по эффективности ничем не отличается от Си, если не использовать виртуальные функции и RTTI. Я себе так представляю, что введение новых абстракций ужасно неэффективно, а поскольку я не умею мыслить в ОО-стиле, код у меня получается такой, что для того, чтобы что-то починить/изменить приходится переписывать всё приложение. Вывод: С++ — BS.
Meow-meow!
Bye-bye! (:
~CheshireCat() { sayGoodbye(); }или
virtual ~CheshireCat() { sayGoodbye(); }?
virtual void sayGoodbye()обязательно должна быть со словом «virtual»?
Виртуальные функции и деструктор