2012-02-07 44 views
1

我在讀這個問題Does calling a destructor explicitly destroy an object completely?這種情況出現在代碼中。手動調用析構函數後如何刪除內存?

Object* aWidget = new Widget(); //allocate and construct 
aWidget->~Object();    //destroy and DON'T deallocate 

從答案,我undrestand,內存區域實際上不會在這種情況下釋放。我的問題是(更多的好奇心比任何東西):

如何刪除上面的兩行代碼執行後由aWidget指向的內存?我會假設調用delete aWidget;會失敗,因爲它會嘗試在已經被破壞的對象上運行析構函數。你可以打電話free(aWidget)或類似的東西,而只是針對內存?

+0

我不能肯定,所以我張貼的評論,但你可以叫'delete操作符(aWidget)'。儘管如此,我仍然很想看到作爲有效用例遇到的代碼。 – 2012-02-07 17:52:23

+0

@CoryNelson你是對的,看我的答案。我在發佈評論時正在輸入它。 – 2012-02-07 17:57:13

回答

3

free事實上,這是我最好的猜測。不過我不認爲你可以在不調用UB的情況下任何東西。你是如何得到調用這樣的析構函數的要求的?

+0

我其實沒有,我只是在閱讀我引用的問題,並對他們如何解決他們所處的情況感到好奇。儘管如此,我已經在使用placement的程序中看到類似這樣的析構函數調用。 – 2012-02-07 18:01:57

+0

@ w00te:是的,它與放置新的不同;) – 2012-02-07 18:02:55

1

在分配有new的對象上調用free未定義的行爲

我建議你保持簡單,並致電delete

不過,如果你想這樣做,你可以,在某些情況下,調用delete即使您以前稱爲析構函數明確。如果你明確地調用它,你可以把它看作一個函數。內存不釋放,所以我猜測設置成員指針NULL後,你摧毀他們將足以防止你遇到任何麻煩。 (因爲在NULL指針上調用delete是無操作)。

例如,下面應該確定:

class A 
{ 
public: 
    int * x; 
    A() 
    { 
     x = new int[10]; 
    } 
    ~A() 
    { 
     delete[] x; 
     x = NULL; 
    } 
}; 

int main() 
{ 
    A* a = new A; 
    a->~A(); 
    delete a; 
    return 0; 
}