У меня самая странная утечка памяти, и я понятия не имею, почему.
У меня есть абстрактный класс следующим образом:
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 ++
Да, неопределенное поведение может привести к утечке памяти, и вот что происходит, когда вы удаляете virtual
деструктор.
3) […] В первом варианте (удалить объект), если статический тип
операнд отличается от своего динамического типа, статический тип должен
быть базовым классом динамического типа операнда и статического типа
должен иметь виртуальный деструктор или поведение не определено. […]
Это действительно UB, как сказал другой ответ.
Я полагал, что те 32 байта потеряли от скрытого указателя (ов) ClassC на vtable.
Сравните sizeof для ClassA и ClassC в вашем примере …
Классы с виртуальным материалом обычно больше, чем сумма его членов ….