如下例:
#include <iostream>
using namespace std;
class Father
{
public:
Father(){cout<<"contructor Father!"<<endl;};
~Father(){cout<<"destructor Father!"<<endl;};
};
class Son:public Father
{
public:
Son(){cout<<"contructor Son!"<<endl;};
~Son(){cout<<"destructor Son!"<<endl;};
};
int main()
{
Father *pfather=new Son;
delete pfather;
pfather=NULL;
return 0;
}
運行結果:
contructor Father!
contructor Son!
destructor Father!
(1)基類的的析構函數不是虛函數的話,刪除指針時,只有其類的內存被釋放,派生類的沒有。這樣就內存泄漏了。
(2)析構函數不是虛函數的話,直接按指針類型調用該類型的析構函數代碼,因為指針類型是基類,所以直接調用基類析構函數代碼。
(3)delete是刪除指針p指向的實例,p指針本身依然存在,delete后將p置為空值是常用做法,空值一般寫成NULL宏,其實就是0。因為內存0位置是不允許訪問的,delete 0操作編譯器可以判斷是錯誤操作不會執行,因此將p置為空值0是很安全的做法。
(4)當基類指針指向派生類的時候,如果析構函數不聲明為虛函數,在析構的時候,不會調用派生類的析構函數,從而導致內存泄露。
(5)子類對象創建時先調用父類構造函數然后在調用子類構造函數,在清除對象時順序相反,所以delete p只清除了父類,而子類沒有清除
總結:
#include <iostream>
using namespace std;
class Father
{
public:
Father(){cout<<"contructor Father!"<<endl;};
virtual ~Father(){cout<<"destructor Father!"<<endl;};
};
class Son:public Father
{
public:
Son(){cout<<"contructor Son!"<<endl;};
~Son(){cout<<"destructor Son!"<<endl;};
};
int main()
{
Father *pfather=new Son;
delete pfather;
pfather=NULL;
return 0;
}
結果:
contructor Father!
contructor Son!
destructor Son!
destructor Father!
