C ++ виртуальный деструктор и утечки памяти

У меня самая странная утечка памяти, и я понятия не имею, почему.
У меня есть абстрактный класс следующим образом:

class ClassA
{
public:
virtual ~ ClassA (){}
virtual void notify(ClassB*) = 0;
virtual void add(ClassB*) = 0;
};

class ClassC : public ClassA
{
public:
void notify(ClassB*)
{
//some cout statements
}
void add(ClassB*)
{
//some cout statements
}
};

int main()
{
ClassA *f = new ClassC();
delete f;
}

Теперь, когда я компилирую код и запускаю Valgrind, он не дает никаких утечек. Однако, когда я удаляю деструктор ClassA (или делаю его не виртуальным), Valgrind сообщает о 32 байтах как о явно потерянной памяти. Я понятия не имею, почему это происходит, так как мой деструктор ничего не делает и нет переменных-членов. Есть идеи?

РЕДАКТИРОВАТЬ: я скомпилировал в Ubuntu 64bit с g ++

0

Решение

Да, неопределенное поведение может привести к утечке памяти, и вот что происходит, когда вы удаляете virtual деструктор.

C ++ 03 5.3.5)

3) […] В первом варианте (удалить объект), если статический тип
операнд отличается от своего динамического типа, статический тип должен
быть базовым классом динамического типа операнда и статического типа
должен иметь виртуальный деструктор или поведение не определено. […]

5

Другие решения

Это действительно UB, как сказал другой ответ.

Я полагал, что те 32 байта потеряли от скрытого указателя (ов) ClassC на vtable.

Сравните sizeof для ClassA и ClassC в вашем примере …

Классы с виртуальным материалом обычно больше, чем сумма его членов ….

1

По вопросам рекламы [email protected]