可能重複:
Is it necessary to call delete[] vs delete for char arrays?刪除char數組。另一種方式?
char *p = new char[200];
delete p;
這種(我改變了變數名稱)的代碼是從一個大的商業項目。
第三行。這是正確的嗎? 我應該改變還是留在那裏?因爲這個和這個程序運行超過4年沒有錯誤報告。
謝謝。
可能重複:
Is it necessary to call delete[] vs delete for char arrays?刪除char數組。另一種方式?
char *p = new char[200];
delete p;
這種(我改變了變數名稱)的代碼是從一個大的商業項目。
第三行。這是正確的嗎? 我應該改變還是留在那裏?因爲這個和這個程序運行超過4年沒有錯誤報告。
謝謝。
您有使用delete[]
因爲您使用new[]
,它不是一個替代方案。
delete [] p;
所以這絕對是一個錯誤。即使在WIndows,Visual Studio編譯器上。[我認爲它有一些優化] –
它碰巧與Visual Studio一起工作,因爲編譯器爲沒有析構函數的類型(如char)爲'delete'和'delete []'生成相同的代碼。儘管它通過了所有的測試用例,但它仍然是一個錯誤。 –
感謝@波佩爾鬆。 –
您爲operator new[]
分配了一個數組。你必須平衡與operator delete[]
,不operator delete
:
delete[] p;
從理論上講,遵循標準,第3行應閱讀delete[] p;
。
但是,在實踐中沒有涉及,因爲焦炭的析構函數什麼都不做。
實際上,刪除和陣列刪除之間的差異,是與陣列刪除,析構函數被稱爲爲有物體多次。通過定期刪除,析構函數只被調用一次。
最後,你應該delete[] p;
如果new
使用[]
取代它,刪除必須將其還有:
T *p = new T[100];
delete [] p; //correct
delete p ; //incorrect
如果new
不使用[]
,必須刪除不使用它,以及:
T *p = new T;
delete [] p; //incorrect
delete p ; //correct
錯誤並不意味着你會得到編譯錯誤;這也不意味着程序在運行時必須失敗。這意味着,程序的行爲是不確定的;任何事情都是可能的,而且很可能會有內存泄漏。
,它已生產了4年一直運行,這意味着你已經在生產內存泄漏了4年。 – riwalk
很多泄漏都是在發出。如果你不反覆分配,沒有人會注意到它。 –
有什麼不對的std ::矢量 –