2009-11-17 212 views
7

後,我做的,說C++數組delete操作符語法

Foo* array = new Foo[N];

我一直刪除了這樣

delete[] array;

不過,有時候我已經看到了這種方式:

delete[N] array;

因爲它似乎編譯和工作(至少在msvc2005),我想知道: 什麼是正確的方法來做到這一點? 爲什麼它以另一種方式進行編譯?

回答

13

您可以點擊以下MSDN鏈接:delete[N] operator。該值被忽略。

EDIT 我試圖上VC9此示例代碼:

int test() 
{ 
    std::cout<<"Test!!\n"; 
    return 10; 
} 

int main() 
{ 
    int* p = new int[10]; 
    delete[test()] p; 
    return 0; 
}; 

輸出是:測試!!

因此表達式被計算,但返回值被忽略。 我很驚訝地說至少,我想不出爲什麼這是必需的情況。

+0

+1。有用的信息 – 2009-11-17 11:01:46

+0

是否意味着你可以刪除[2N]數組;那會編譯 – 2009-11-17 11:03:16

+0

謝謝,這就是我一直在尋找的東西。 – raven 2009-11-17 11:07:58

5

delete[] array;是正確的形式。

4

正確的方法是做delete[] array;。我甚至不知道delete[N] array;會編譯(我懷疑它應該)。

+1

它在VC9上編譯時出現'warning C4208:使用非標準擴展:delete [exp] - exp評估但忽略'我不是那個意思,雖然 – Naveen 2009-11-17 10:48:55

+1

這意味着代碼是(1)無效的C++和2)表達式「N」被評估但被忽略。這是相當無關緊要的,但它描述瞭如果您編寫'delete [N ++] array;' - N首先增加,然後被忽略會發生什麼。 – MSalters 2009-11-17 14:12:41

+0

真的,它首先被忽略,然後遞增:) – raven 2009-11-26 17:22:10

5

第二種情況是否正確我建議使用第一種,因爲它不太容易出錯。

Visual Studio編譯了很多它不應該的東西。

+4

「Visual Studio編譯了很多它不應該的東西。」阿門。 – sbi 2009-11-17 10:45:35

10

delete [N] array無效。它沒有在C++標準中定義:5.3.5節將刪除表達式定義爲delete exprdelete [] expr,除此之外別無其他。它不會在gcc(版本4.1.2)上編譯。至於爲什麼它在Visual C++中編譯:請問微軟。

+0

哪個C++標準?而且,你有鏈接/參考,哪裏可以找到它? – Kissaki 2011-10-03 10:55:37

+1

@Kissaki:我會指的是C++ 03,它在網上沒有合法的可用性。然而,該措詞是在C++ 11很相似,其草案可在http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf – 2011-10-03 11:04:22

+0

啊,謝謝.. – Kissaki 2011-10-03 20:37:57

-2

如果它有效,它是一個非標準擴展。

delete [] array; 

是正確的形式。

delete array; 

有時也會工作,但依賴於實現(因此是錯誤的)。

+1

對於非數組指針,明確定義了第二種形式(不包含括號)的行爲。它的行爲不是。無論如何,我想這就是爲什麼有人投你一票。 – 2009-11-17 13:33:04

+1

'刪除數組'在任何意義上都不「起作用」,除非你的意思是它不會使程序崩潰。它不會回收首先分配的所有內存,如果它沒有崩潰,它只會在數組中的第一個對象上運行析構函數。 (如果你做了新的Foo [0]',那麼這也是一個錯誤。) – Bill 2009-11-17 14:39:48

+1

@Bill:我希望我能夠評論評論。你的陳述有時候可能是真的,有時候它可能不對。在這裏看到:http://stackoverflow.com/questions/1553382/1553407#1553407和我的評論在這裏:http://stackoverflow.com/questions/1553382/1553391#1553391 – sbi 2009-11-17 15:28:05

4

第一點:幾乎從來沒有一個很好的理由使用新的或刪除的數組形式開始 - 使用std :: vector(或其他容器)。第二:在C++的黑暗時代,你必須指定你正在刪除的數組的大小,所以如果你使用了x = new T[N],那麼匹配的刪除是delete [N] x。明確指定大小的要求在以前被移除了long,但是一些編譯器(特別是那些關心與古代代碼的向後兼容性的編譯器)仍然允許它。

,除非你真的需要保持一個古老的編譯器(一個是20歲左右)兼容,你不應該使用它。然後再說一遍,除非你需要與一個如此老的編譯器保持兼容,否則它不支持任何標準容器,你不應該首先使用new或delete的數組形式。停下來!

+0

感謝您的歷史課。 然後,如果我必須通過的,動態數組說,花車,向第三方libray,這是正確的方式做到這一點王氏標準集裝箱? – raven 2009-11-17 15:28:53

+0

使用矢量。當您需要傳遞地址/長度時,請使用&vec [0]和vec.size()。 – 2009-11-17 15:55:52

+0

+1:在標準的'94草案中,語法已經是'delete []'了。同一年,Design and Evolution(p218)評論說這個語法「...證明太容易出錯,所以跟蹤元素數量的負擔被放在實現上。」 – 2009-11-17 17:42:43