對於這個: m_sFilename = new char [len+1];
「new char []」是否需要手動釋放資源?
要我打電話delete[] m_sFilename;
某個時候?
和:
我應該用delete[] m_sFilename
或delete m_sFilename;
?
對於這個: m_sFilename = new char [len+1];
「new char []」是否需要手動釋放資源?
要我打電話delete[] m_sFilename;
某個時候?
和:
我應該用delete[] m_sFilename
或delete m_sFilename;
?
「new char []」是否需要手動釋放資源?
是的。
對於這一點:
m_sFilename = new char [len+1];
要我打電話delete[] m_sFilename;
某個時候?
是的。
我應該用
delete[] m_sFilename
還是delete m_sFilename;
?
delete[]
。
,但你應該實際上使用std::string
,這所有的這一切對你來說,是免費的。
儘管使用'std :: string'的建議是正確的,但我相信它放錯了位置。難道不應該先學習'new []'和'delete []'而不是隱藏在'std :: string'後面嗎? – Jaywalker
@Jaywalker:不適用於'char'。而且,更進一步,甚至可以說'std :: vector'和'std :: string'應該在數組和動態分配等細節中學會。不幸的是,由於歷史原因,C++幾乎沒有這樣教過。 –
@Jaywalker - 你需要用'new []'和'delete []'做的第一件事是重寫相當於'std :: string'。它們本身就是不安全的。 – Mankarse
是的,如果你不想讓由new[]
分配的內存泄漏,你應該在使用該內存時使用delete[]
。
爲了避免跟蹤內存,我建議您使用std::string
或std::vector
來代替。
*什麼是錯誤* Nitpick *不爲'new []'分配的指針調用'delete []'技術上會導致**未定義行爲**,這很可能導致**內存泄漏* * 在這種情況下。 –
所以,刪除[] m_sFilename是正確的。對? –
@Als:它說它是UB?如果你正在考慮n3290'3.8/4',「[..]但是,如果沒有顯式調用析構函數或者沒有使用delete-expression(5.3.5)釋放存儲,析構函數不應該被隱式調用,任何依賴析構函數產生的副作用的程序都有未定義的行爲。「,那麼我認爲這不適用。 –
是的,但使用std::string
來代替- 它在各方面都更好。
對於本機數據類型,並且使用delete
或delete[]
將意味着相同的不具有析構函數用戶定義的數據類型。底層堆管理器將釋放所有的內存。但通過向量new(new[]
)調用縮放器delete
不會使所有析構函數被調用。對於第一個對象,析構函數只會被調用一次。
上面給出的行爲是編譯器/堆管理器(這是處理new
和delete
)相關。爲了更好的便攜性,使用縮放器刪除縮放器新和矢量刪除(delete[]
)爲向量new
。
準確地說,不,你不需要;你可能應該,如果可以的話;不這樣做的結果可能從完全良性的行爲到導致碰撞的內存泄漏。 – Patrick87
你使用了哪種恐怖的C++語言書?再來一個。 –
有時?你爲什麼會在某個時候調用某個函數而不是其他時間? – Jaywalker