4 回答

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

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

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

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