4 回答

TA貢獻1847條經驗 獲得超7個贊
編譯器不知道它是一個數組,而是在信任程序員。刪除指向intwith 的指針delete []將導致未定義的行為。您的第二個main()示例是不安全的,即使它沒有立即崩潰也是如此。
編譯器確實必須跟蹤需要刪除多少個對象。它可以通過過度分配足夠的空間來存儲數組大小來實現此目的。有關更多詳細信息,請參見C ++ Super FAQ。

TA貢獻1815條經驗 獲得超10個贊
到目前為止給出的答案似乎并沒有解決一個問題:如果運行時庫(不是操作系統,實際上不是)可以跟蹤數組中的事物數量,那么為什么我們根本需要delete[]語法?為什么不能使用單個delete表單來處理所有刪除?
對此的答案可以追溯到C ++的根源,即C兼容語言(它不再是真正的努力。)Stroustrup的哲學是程序員不必為未使用的任何功能付費。如果他們不使用數組,則不必為每個分配的內存塊承擔對象數組的費用。
也就是說,如果您的代碼只是
Foo* foo = new Foo;
那么分配給它的內存空間foo不應包含支持的數組所需的任何額外開銷Foo。
由于僅設置了數組分配來承載額外的數組大小信息,因此您需要告訴運行時庫在刪除對象時尋找該信息。這就是為什么我們需要使用
delete[] bar;
而不只是
delete bar;
如果bar是指向數組的指針。
對于我們大多數人(包括我自己在內)來說,如今對一些額外的內存字節的煩惱似乎很古怪。但是,在某些情況下,保存幾個字節(可能來自大量的內存塊)可能很重要。

TA貢獻1890條經驗 獲得超9個贊
是的,操作系統將某些內容保留在“后臺”中。例如,如果您運行
int* num = new int[5];
操作系統可以分配額外的4個字節,將分配的大小存儲在已分配內存的前4個字節中,并返回偏移量指針(即,它將內存空間分配為1000到1024,但返回的指針指向1004,位置為1000- 1003存儲分配的大?。?。然后,當調用delete時,它可以在傳遞給它的指針之前查看4個字節,以查找分配的大小。
我相信還有其他方法可以跟蹤分配的大小,但這是一種選擇。

TA貢獻1863條經驗 獲得超2個贊
這與這個問題非常相似,并且包含許多您正在尋找的細節。
但是足以說,跟蹤任何這些都不是操作系統的工作。實際上,運行時庫或底層的內存管理器將跟蹤數組的大小。通常,這是通過在前面分配額外的內存并在該位置存儲數組的大小來完成的(大多數使用頭節點)。
通過執行以下代碼,這在某些實現中是可見的
int* pArray = new int[5];
int size = *(pArray-1);
添加回答
舉報