2016-08-04 83 views
2

我想知道是否有人可以幫助我解決一些混亂,我有獨特的指針。請看下面的代碼:獨特的指針內存泄漏

// some class "complex" defined here 

int main() 
{ 
    while(1) 
    { 
     unique_ptr<complex> p(new complex[256]); 
     p.reset(); 
    } 
    return 1; 
} 

現在從我的理解,當我的唯一指針調用reset()應該刪除其原始指針所指的對象。在這種情況下,該對象碰巧是創建的256個類型中的第一個對象,類型爲complex。因爲這就是new complex[256]所做的,對嗎?它只是返回一個指向數組中第一個對象的指針(它當然也創建它)?所以剩下的256個對象應該保持不變。

遵循這個邏輯,無限循環應該創建一個內存泄漏,但是這不會發生。我正在使用MS Visual Studio 2013.

我錯過了什麼?我會很感激,如果有人可以填補我在這裏發生了什麼,並確認或拒絕我的猜想

回答

10

unique_ptr將調用時,它超出範圍它擁有指針delete。因此,您將使用delete而不是delete[]刪除由new[]分配的內存。這是未定義的行爲,試圖進一步推論爲什麼你的代碼不像你期望的那樣行事是沒有意義的。

但是,可能發生的是在該指針上調用delete意味着只有數組中的第一個對象被銷燬(意味着它的析構函數被調用)。其餘255個對象不會調用析構函數,但整個數組佔用的內存仍然被釋放。

我認爲你的期望是你的程序使用越來越多的內存,並在new分配失敗時最終死亡,但是如果數組佔用的內存被釋放,那就永遠不會發生。


處理與一個unique_ptr陣列中的正確的方法是使用數組類型的部分特

unique_ptr<complex[]> p(new complex[256]); 
//    ^^ 

或者,如果你的標準庫實現std::make_unique(C++ 14),然後使用

auto p = std::make_unique<complex[]>(256); 
+5

避免'new'和使用'make_unique'會避免這種錯誤的:'自動p =標準:: make_unique (256);' – Jarod42

+0

怎麼來的日e內存正在被釋放而沒有明確被告知這樣做?這是一個編譯器的特定功能嗎?最後,'std :: default_delete '是否也用於數組特化,假定它用於主模板?真的很感謝快速回復傢伙。 – MutomboDikey

+1

內存被明確告知要在'unique_ptr'內部釋放。這不是編譯器功能,只是該類如何實現。對於數組的特殊化,'T'應該被看作'complex []',所以'std :: default_delete '會被'delete []' – wasthishelpful