Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> отсутствие виртуальных деструкторов, возможна ли утечка памяти? 
V
    Опции темы
neosapient
Дата 29.10.2020, 01:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 16.8.2006

Репутация: нет
Всего: 4



Здравствуйте.

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

Интерфейс для класса А определен ниже. В нем только виртуальные методы.
*.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, но не для субобъекта А.
Что меня интересует: будет ли удален субобъект класса А из оперативной памяти? - те самые несколько пустых байт, что сгенерирует компилятор. 
Или эти несколько байт замусорят память?

Спасибо.
PM MAIL   Вверх
xvr
Дата 30.10.2020, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



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

Нет

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

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

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

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

PM MAIL   Вверх
neosapient
Дата 31.10.2020, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 16.8.2006

Репутация: нет
Всего: 4



Понял.
Спасибо.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1240 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.