2012-04-01 64 views
0
class finder 
{ 
    public: 
     finder(); 
     ~finder(); 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    finder* pfind = new finder(L"test"); 
    finder find(L"test2"); 
    system("PAUSE"); 
    return 0; 
} 

我知道find的析構函數將在程序退出後調用,但pfind的析構函數將不會被調用。我的問題是爲什麼?我應該加指向對象及其析構函數

delete _pfind; 

返回0之前嗎?

+0

你不應該添加'delete',你應該刪除'new'。 – avakar 2012-04-01 16:19:21

+1

你的代碼充滿了錯誤;如果你要發佈片段,你應該儘可能使它們正確。 – meagar 2012-04-01 16:20:46

+1

@avakar學習'new'和'delete'沒有什麼錯。當然,如果你不喜歡它們,你可以找到避免它們的方法,但實際使用它們並使它們適應並從錯誤中學習並決定你是否喜歡它們是沒有問題的。 – 2012-04-01 16:25:12

回答

3

「爲什麼」是因爲你負責管理你new創建對象的生命週期。

的語言說,具有自動存儲時間的對象(比如在你的榜樣find)住,只要在其中創建它們的塊。這些都會自動刪除(你不能做自己),在適當的時候(即通常當你離開該塊。)

動態存儲持續時間的對象(像什麼pfind點),最後直到您刪除它們。沒有什麼會爲你刪除它們。

所以,是的,你需要自己刪除它在這種情況下,delete pfind;

(或使用相應類型的智能指針爲您的使用情況。)

1

是的,你應該明確地通過調用非託管指針delete清理你分配內存。通常情況下,通過new分配內存的任何代碼塊必須通過delete取消分配該內存的代碼塊進行平衡。

0

墊是正確的,但我注意到你正在使用CLR/.NET C++(或不管他們叫這些天)。我相信這是一個gcnew關鍵字,它將與new關鍵字完成相同的操作,但在其範圍末尾刪除該對象。這也被稱爲垃圾收集。在個人筆記newgcnew是一個很好的工具,因爲它們都很好地適應不同的情況。請記住,如果您使用gcnew,代碼將不會跨平臺。