今天突然想到一個問題,詳情看代碼吧。
奇怪的問題
#include <stdio.h>
#include <iostream>
class A
{
public:
A() { std::cout << "i am A." << std::endl; }
~A() { std::cout << "release A." << std::endl; }
};
class B : public A
{
public:
B() { std::cout << "i am B." << std::endl; }
~B() { std::cout << "release B." << std::endl; }
};
執行如下代碼:
A *pA = new B();
delete pA;
此時看到的log如下:
i am A.
i am B.
release A.
那么,這個時候,class B
的析構函數沒有被調用到,(在class B
的對象中包含其他對象,或者不包含其他對象的情況下)這樣會導致內存泄漏嗎?
避免上面的問題
對于上面問題,在不確定是否會導致內存泄漏前,寫代碼的時候可以注意將class
的析構函數寫為虛函數.示例如下:
#include <stdio.h>
#include <iostream>
class A
{
public:
A() { std::cout << "i am A." << std::endl; }
virtual ~A() { std::cout << "release A." << std::endl; }
};
class B : public A
{
public:
B() { std::cout << "i am B." << std::endl; }
~B() { std::cout << "release B." << std::endl; }
};
再執行如下代碼:
A *pA = new B();
delete pA;
看到的log就是這樣了:
i am A.
i am B.
release B.
release A.
解答
還沒有答案咯。