Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > отсутствие виртуальных деструкторов


Автор: neosapient 29.10.2020, 01:27
Здравствуйте.

Хочу задать класс-интерфейс с пустыми виртуальными методами. 
И хочу спрятать всю функциональность в статическую библиотеку.
Нет ли утечки памяти из-за такой реализации?

Интерфейс для класса А определен ниже. В нем только виртуальные методы.
*.h-файл
Код

class A
{
public:
    virtual void foo() = 0;
    virtual void delete_me() = 0;
};

A* createObject();


Статическая библиотека
Код

class B: public A
{
public:
    virtual void foo();
    virtual void delete_me();
};

void B::foo()
{...}

void B::delete_me()
{ delete this; }

 A* createObject()
{ new B(); }


Использование статической библиотеки сторонним программистом.
Код

void main()
{
    A* a = createObject(); // создаю объект
    a->foo(); // что то делаю
    a->delete_me(); // удаляю объект <- вопрос про этот момент в коде
}

То есть был создан объект класса B.
Потом объект был удален.
Но объект класса В содержит в себе субобъект класса А. (Если я правильно помню, то компиляторы выделяли несколько пустых байт под класс А, хоть в классе А нет переменных). 
Так как деструктор не виртуальный, то будет вызван деструктор только для объекта класса B, но не для субобъекта А.
Что меня интересует: будет ли удален субобъект класса А из оперативной памяти? - те самые несколько пустых байт, что сгенерирует компилятор. 
Или эти несколько байт замусорят память?

Спасибо.

Автор: xvr 30.10.2020, 20:28
Цитата(neosapient @  29.10.2020,  01:27 Найти цитируемый пост)
Если я правильно помню, то компиляторы выделяли несколько пустых байт под класс А

Нет

Цитата(neosapient @  29.10.2020,  01:27 Найти цитируемый пост)
Так как деструктор не виртуальный, то будет вызван деструктор только для объекта класса B, но не для субобъекта А.

Нет, будут вызваны оба деструктора

Проблемы будут если вы попытаетесь сделать delete a Вот тогда деструктор B вызван не будет

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

Автор: neosapient 31.10.2020, 16:30
Понял.
Спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)