class A
{
int a;
virtual void test() = 0;
}
class B : public A
{
int b, c, d, e, f;
void test();
}
A* aa = new B();
delete aa;
Jak widać klasa A ma x bajtów a klasa B >x Czy po wywołaniu delete na wskaźniku do A tworzę wyciek pamięci?
class A
{
int a;
virtual void test() = 0;
}
class B : public A
{
int b, c, d, e, f;
void test();
}
A* aa = new B();
delete aa;
Jak widać klasa A ma x bajtów a klasa B >x Czy po wywołaniu delete na wskaźniku do A tworzę wyciek pamięci?
Tak, ponieważ w klasie bazowej nie masz zdefiniowanego destruktora wirtualnego.
class A
{
int a;
virtual void test() = 0;
virtual ~A() = default;
}
class B : public A
{
int b, c, d, e, f;
void test();
}
A* aa = new B();
delete aa;
Czy to załatwia sprawę? Czy muszę zadeklarować w B?
Wystarczy.
Kompilator nawet o tym ostrzega (jeśli pola w klasie B lub samo B mają istotny destruktor):
http://melpon.org/wandbox/permlink/SLpyKlFPkwhX4B9W
http://melpon.org/wandbox/permlink/2g4EBD1W9PuAeNqf