程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++: delete與內存洩露

C++: delete與內存洩露

編輯:C++入門知識

C++: delete與內存洩露


在C++中可以方便地通過運算符new和delete來動態分配內存,其中new的默認語義是分配內存並調用構造函數,而delete的默認語義是調用析構函數並釋放內存,需要注意的是這兩個運算符都和指針打交道,而涉及到指針事情就有點復雜了,來看一個例子:

class A {
	public:
	~A() { cout<<"destructor of A"<在這個例子中,B繼承於A,所以A的指針可以指向B,在main()中我們動態創建了一個B的對象,並用一個A的指針來指向它,當我們不需要這個對象時,理應調用B的析構函數並釋放掉相應的內存,所以直接就 delete p 了,那麼輸出結果呢?

destructor of A;

只有A的析構函數被調用了,所以如果我們在B的析構函數中有一些釋放內存的操作,那麼這些釋放內存的操作不會被執行,從而引發內存洩露,導致這個問題的原因在於編譯器認為delete後面跟的是靜態指針,所以它會根據p的類型來在編譯期確定哪個析構函數被調用,在此例中,p是A類型的指針,所以A的析構函數被調用。避免這個問題的方法是使用虛析構函數,如下:

#include 
using namespace std;

class A {
	public:
	virtual ~A() { cout<<"destructor of A"<在此例中,A的析構函數用virtual來修飾,意味著所以派生於A的類及A都擁有虛析構函數,虛析構函數也是虛函數,所以會用到C++的動態綁定機制,這樣當delete p的時候,編譯器發現p雖然是A類型的,但是A擁有虛析構函數,所以它就按照虛函數的調用機制來安插代碼從而在執行期調用p真正指向的對象的析構函數,所以最終可以在執行期找到B的析構函數,執行結果也如我們所料:先調用B的析構函數,再調用基類A的析構函數

destructor of B;
destructor of A;

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved