2011-08-18 95 views
4

對於這個: m_sFilename = new char [len+1];「new char []」是否需要手動釋放資源?

要我打電話delete[] m_sFilename;某個時候?

和:

我應該用delete[] m_sFilenamedelete m_sFilename;

+0

準確地說,不,你不需要;你可能應該,如果可以的話;不這樣做的結果可能從完全良性的行爲到導致碰撞的內存泄漏。 – Patrick87

+1

你使用了哪種恐怖的C++語言書?再來一個。 –

+0

有時?你爲什麼會在某個時候調用某個函數而不是其他時間? – Jaywalker

回答

7

「new char []」是否需要手動釋放資源?

是的。

對於這一點:m_sFilename = new char [len+1]; 要我打電話delete[] m_sFilename;某個時候?

是的。

我應該用delete[] m_sFilename還是delete m_sFilename;

delete[]


,但你應該實際上使用std::string,這所有的這一切對你來說,是免費的。

+0

儘管使用'std :: string'的建議是正確的,但我相信它放錯了位置。難道不應該先學習'new []'和'delete []'而不是隱藏在'std :: string'後面嗎? – Jaywalker

+1

@Jaywalker:不適用於'char'。而且,更進一步,甚至可以說'std :: vector'和'std :: string'應該在數組和動態分配等細節中學會。不幸的是,由於歷史原因,C++幾乎沒有這樣教過。 –

+1

@Jaywalker - 你需要用'new []'和'delete []'做的第一件事是重寫相當於'std :: string'。它們本身就是不安全的。 – Mankarse

4

是的,如果你不想讓由new[]分配的內存泄漏,你應該在使用該內存時使用delete[]

爲了避免跟蹤內存,我建議您使用std::stringstd::vector來代替。

+0

*什麼是錯誤* Nitpick *不爲'new []'分配的指針調用'delete []'技術上會導致**未定義行爲**,這很可能導致**內存泄漏* * 在這種情況下。 –

+0

所以,刪除[] m_sFilename是正確的。對? –

+0

@Als:它說它是UB?如果你正在考慮n3290'3.8/4',「[..]但是,如果沒有顯式調用析構函數或者沒有使用delete-expression(5.3.5)釋放存儲,析構函數不應該被隱式調用,任何依賴析構函數產生的副作用的程序都有未定義的行爲。「,那麼我認爲這不適用。 –

2

是的,但使用std::string來代替​​- 它在各方面都更好。

0

對於本機數據類型,並且使用deletedelete[]將意味着相同的不具有析構函數用戶定義的數據類型。底層堆管理器將釋放所有的內存。但通過向量new(new[])調用縮放器delete不會使所有析構函數被調用。對於第一個對象,析構函數只會被調用一次。

上面給出的行爲是編譯器/堆管理器(這是處理newdelete)相關。爲了更好的便攜性,使用縮放器刪除縮放器新和矢量刪除(delete[])爲向量new