2011-08-18 90 views
1

可能重複:
Is it necessary to call delete[] vs delete for char arrays?刪除char數組。另一種方式?

char *p = new char[200]; 

delete p; 

這種(我改變了變數名稱)的代碼是從一個大的商業項目。

第三行。這是正確的嗎? 我應該改變還是留在那裏?因爲這個和這個程序運行超過4年沒有錯誤報告。

謝謝。

+4

,它已生產了4年一直運行,這意味着你已經在生產內存泄漏了4年。 – riwalk

+0

很多泄漏都是在發出。如果你不反覆分配,沒有人會注意到它。 –

+1

有什麼不對的std ::矢量

回答

5

使用delete[]因爲您使用new[],它不是一個替代方案。

delete [] p; 
+0

所以這絕對是一個錯誤。即使在WIndows,Visual Studio編譯器上。[我認爲它有一些優化] –

+2

它碰巧與Visual Studio一起工作,因爲編譯器爲沒有析構函數的類型(如char)爲'delete'和'delete []'生成相同的代碼。儘管它通過了所有的測試用例,但它仍然是一個錯誤。 –

+0

感謝@波佩爾鬆。 –

1

您爲operator new[]分配了一個數組。你必須平衡與operator delete[]operator delete

delete[] p; 
2

從理論上講,遵循標準,第3行應閱讀delete[] p;

但是,在實踐中沒有涉及,因爲焦炭的析構函數什麼都不做。

實際上,刪除和陣列刪除之間的差異,是與陣列刪除,析構函數被稱爲爲有物體多次。通過定期刪除,析構函數只被調用一次。

最後,你應該delete[] p;

3
  • 如果new使用[]取代它,刪除必須將其還有:

    T *p = new T[100]; 
    delete [] p; //correct 
    delete p ; //incorrect 
    
  • 如果new不使用[],必須刪除不使用它,以及:

    T *p = new T; 
    delete [] p; //incorrect 
    delete p ; //correct 
    

錯誤並不意味着你會得到編譯錯誤;這也不意味着程序在運行時必須失敗。這意味着,程序的行爲是不確定的;任何事情都是可能的,而且很可能會有內存泄漏。