LINUX.ORG.RU

http://www.kalinin.ru/programming/cpp/28_07_00.shtml

В принципе, в практически любой мало-мальски толковой книге по C++ рассказывается, зачем нужны виртуальные деструкторы и почему их надо использовать. Тем не менее, как показывает практика, ошибка, связанная с отсутствием виртуальных деструкторов, настолько распространена, что я решил еще раз рассказать о ней.....Дальше не для Ъ, по ссылке

madcore ★★★★★
()

Чтоб delete отрабатывал как надо. Независимо от того, как объявлен указатель.

svu ★★★★★
()

если у класса есть виртуальные методы, то предполагается полиморфное поведение - обособленная работа с обьектом через указатель на интерфейс (базовый класс). operator new() при создании обьекта располагает информацией о его динамическом типе, operator delete() при удалении - нет. поэтому единственная возможность препятствовать удалению неправильного (более общего) типа - предоставить operator delete() необходимую для удаления обьекта информацию посредством таблицы виртуальных функций

jtootf ★★★★★
()

Проблема не в наличии виртуальных методов, а в сложностях типа:

for(std::vector<A*>::iterator i = ... ) delete *i;

т.е. нужно делать виртуальные деструкторы в принципе для всех классов, что бы избежать подобных сложностей в подобных случаях.

anonymous
()
Ответ на: комментарий от anonymous

Проблема не в наличии виртуальных методов, а в сложностях типа:

for(std::vector<A*>::iterator i = ... ) delete *i;

т.е. нужно делать виртуальные деструкторы в принципе для всех классов, что бы избежать подобных сложностей в подобных случаях????

anonymous
()
Ответ на: комментарий от anonymous

> Проблема не в наличии виртуальных методов, а в сложностях типа: for(std::vector<A*>::iterator i = ... ) delete *i;

да

dilmah ★★★★★
()
Ответ на: комментарий от Legioner

>Если у класса нет виртуальных методов, виртуальный конструктор формально не обязателен

корректней будет "если класс не предполагает полиморфного поведения". виртуальных функций-членов на определённом этапе разработки у класса может не быть, но иерархия классов при этом может предполагать их наличие - просто данная функциональность в проект ещё не была внесена. отслеживать потом утечки памяти из-за подобного подхода - не лучшее времяпровождение, отнюдь

jtootf ★★★★★
()

В нормальных языках вообще невозможно создать одновременно полиморфный тип и статический финализатор для него.

anonymous
()
Ответ на: комментарий от anonymous

> В нормальных языках вообще невозможно создать одновременно полиморфный тип и статический финализатор для него.

а вот у нас - можно, и мы горды этим фактом :-P

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от klalafuda

угу :) Можно даже *((char*) 0) = 0 написать, и в досе это даже будет работать :) наверное.

Legioner ★★★★★
()
Ответ на: комментарий от anonymous

Слушай тут проблем ни каких нет, добавление виртуального диструктора там где он не нужен только раздует класc.

aton
()
Ответ на: комментарий от jtootf

Чего то я твою мысль уловить не могу, можно как то проще изложить? Причем тут утечки?

aton
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.