2011-10-02 162 views
0

在C++中,刪除指針的建議方法是什麼?例如,在下面的情況下,我是否需要全部三行來安全地刪除指針(如果是這樣,它們是做什麼的)?刪除指針

// Create 
MyClass* myObject; 
myObject = new MyClass(myVarA, myVarB, myVarC); 

// Use 
// ... 

// Delete 
if(myObject) { 
    delete myObject; 
    myObject = NULL; 
} 

回答

6

不,你不需要檢查NULL
delete小心如果傳遞的指針是NULL

delete myObject; 
myObject = NULL; 

就足夠了。

作爲一般性政策,請儘量避免使用freestore分配,並且如果您必須使用智能指針(RAII而不是原始指針。


C++ 03標準第§3.7.3.2.3:

供給的標準庫中提供的解除分配功能中的一個的第一個參數的值可以是空指針值;如果是這樣,對解除分配函數的調用不起作用。否則,在標準庫中提供給operator delete(void *)的值應該是之前調用標準中的operator new(size_t)或operator new(size_t,const std :: nothrow_t &)所返回的值之一庫中,並且標準庫中提供給操作員刪除的值應爲先前調用標準庫中操作員new或operator new [](size_t,const std :: nothrow_t &)所返回的值之一。

+0

只是'刪除myObject;'已經足夠了。 –

+1

@ R.MartinhoFernandes:實際上,在編寫額外的代碼行時我沒有看到真正的開銷。雖然這是一個敏感的話題,純粹主義者很少辯論是否真的需要這樣做,我寧願這樣做,因爲這樣做不會產生任何不良影響,但給了我一個可能的安全保證。 –

4

不,你不需要那個。

只需編寫delete p,並且不要接受任何倡導自己做得更多的人的建議。

一般建議:避免生newdelete。讓一些標準容器處理分配,複製和釋放。或者使用智能指針。

乾杯&心連心,

3

最好使用資源管理類,讓圖書館照顧,對你:

#include <memory> 


void foo() // unique pointer 
{ 
    std::unique_ptr<MyClass> myObject(new Myclass(myVarA, myVarB, myVarC)); 
    // ... 
} // all clean 

void goo() // shared pointer -- feel free to pass it around 
{ 
    auto myObject = std::make_shared<MyClass>(myVarA, myVarB, myVarC); 
    // ... 
} // all clean 

void hoo() // manual -- you better know what you're doing! 
{ 
    MyClass * myObject = new MyClass(myVarA, myVarB, myVarC); 
    // ... 
    delete myObject; // hope there wasn't an exception! 
} 
+0

你能解釋一下這些指針之間的區別嗎? – Ben

+0

請參閱[此問題](http:// stackoverflow。com/questions/6876751/unique-ptr-and-shared-ptr之間的差異)以及其中的鏈接。 –

2

我想補充的是設置指針爲NULL它的後一直是delete'd是一個好主意,所以你不要留下任何晃動的指針,因爲試圖取消引用NULL指針可能會立即崩潰你的應用程序(所以調試起來相對容易),而取消引用懸掛指針可能會導致應用程序在某個隨機點崩潰,並且更加困難追蹤並修復。

+2

它從來不是一個好主意:它只是隱藏錯誤並導致更多的工作 –

+0

刪除它後,將指針設置爲空總是一個好主意*如果*你正在做自己的內存管理(即使用'new'和'delete')。即使你知道*沒有人會訪問該指針(例如,'delete'在析構函數中),它仍然是一個好主意,並且成本很低。花費更多的工作(一小部分額外工作)只是管理記憶的衆多成本之一。 –

+0

@David:我指的是追蹤bug的更多工作。 –