Would it lead to memory leak when delete base class pointer without virtual destructor?
下面是一个解释虚拟析构函数的示例。(请参阅http://www.geeksforgeks.org/g-fact-37/)我基于该示例修改了代码,并对内存泄漏提出了一个问题。
假设基类有一个int num变量,派生类有一个float money变量。
调用
我的问题是"函数delete是否足够智能,以便释放为int num(基类)和float money(派生类)分配的内存?"
我认为base ptr是base*类型的指针,因此它可能只释放基类所需的内存量。然而,似乎int和float都将被释放,即使base ptr指向基类的类型。如果是这样的话,如果我们使
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | #include <iostream> using namespace std; class Base { public: int num; Base(int n):num(n){ cout<<"Base::Constructor "; } virtual ~Base(){ cout<<"Base::Destructor "; } }; class Derived : public Base { private: float money; public: Derived(int n, float m):Base(n),money(m){ cout<<"Derived::Constructor "; } ~Derived(){ cout<<"Derived::destructor "; } }; int main() { Base *base_ptr = new Derived(1,200.0); delete base_ptr; return 0; } |
你所描述的是未定义的行为,这意味着任何讨厌的事情都可能出错,而不仅仅是内存泄漏。
但是在实践中,如果继承不是虚拟的,派生类没有其他的基类,并且派生类没有具有非平凡析构函数的成员,那么您可能会调用