亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

delete []如何知道它是一個數組?

delete []如何知道它是一個數組?

好吧,我認為我們都同意,根據所傳遞的內容,未定義以下代碼所發生的情況,void deleteForMe(int* pointer){     delete[] pointer;}指針可能是各種各樣的東西,因此delete[]對它執行無條件的操作是不確定的。但是,假設我們確實在傳遞數組指針,int main(){     int* arr = new int[5];     deleteForMe(arr);     return 0;}我的問題是,在這種情況下,指針是一個數組,誰知道呢?我的意思是,從語言/編譯器的角度來看,它不知道arr數組指針還是指向單個int的指針。哎呀,它甚至不知道是否arr是動態創建的。但是,如果我改為執行以下操作,int main(){     int* num = new int(1);     deleteForMe(num);     return 0;}操作系統足夠聰明,只能刪除一個int,而不會通過刪除超出該點的其余內存來進行某種類型的“殺戮狂潮”(與帶有strlen和非\0終止字符串的字符串進行對比-它會一直運行直到它點擊0)。那么記住這些事情是誰的工作呢?操作系統是否在后臺保留某種類型的記錄?(我的意思是,我意識到我在開始這篇文章時是說發生的事情是不確定的,但事實是,“殺人狂潮”的情況沒有發生,因此在實際世界中有人會記住。)
查看完整描述

4 回答

?
aluckdog

TA貢獻1847條經驗 獲得超7個贊

編譯器不知道它是一個數組,而是在信任程序員。刪除指向intwith 的指針delete []將導致未定義的行為。您的第二個main()示例是不安全的,即使它沒有立即崩潰也是如此。


編譯器確實必須跟蹤需要刪除多少個對象。它可以通過過度分配足夠的空間來存儲數組大小來實現此目的。有關更多詳細信息,請參見C ++ Super FAQ。


查看完整回答
反對 回復 2019-10-05
?
動漫人物

TA貢獻1815條經驗 獲得超10個贊

到目前為止給出的答案似乎并沒有解決一個問題:如果運行時庫(不是操作系統,實際上不是)可以跟蹤數組中的事物數量,那么為什么我們根本需要delete[]語法?為什么不能使用單個delete表單來處理所有刪除?


對此的答案可以追溯到C ++的根源,即C兼容語言(它不再是真正的努力。)Stroustrup的哲學是程序員不必為未使用的任何功能付費。如果他們不使用數組,則不必為每個分配的內存塊承擔對象數組的費用。


也就是說,如果您的代碼只是


Foo* foo = new Foo;

那么分配給它的內存空間foo不應包含支持的數組所需的任何額外開銷Foo。


由于僅設置了數組分配來承載額外的數組大小信息,因此您需要告訴運行時庫在刪除對象時尋找該信息。這就是為什么我們需要使用


delete[] bar;

而不只是


delete bar;

如果bar是指向數組的指針。


對于我們大多數人(包括我自己在內)來說,如今對一些額外的內存字節的煩惱似乎很古怪。但是,在某些情況下,保存幾個字節(可能來自大量的內存塊)可能很重要。


查看完整回答
反對 回復 2019-10-05
?
當年話下

TA貢獻1890條經驗 獲得超9個贊

是的,操作系統將某些內容保留在“后臺”中。例如,如果您運行


int* num = new int[5];

操作系統可以分配額外的4個字節,將分配的大小存儲在已分配內存的前4個字節中,并返回偏移量指針(即,它將內存空間分配為1000到1024,但返回的指針指向1004,位置為1000- 1003存儲分配的大?。?。然后,當調用delete時,它可以在傳遞給它的指針之前查看4個字節,以查找分配的大小。


我相信還有其他方法可以跟蹤分配的大小,但這是一種選擇。


查看完整回答
反對 回復 2019-10-05
?
小唯快跑啊

TA貢獻1863條經驗 獲得超2個贊

這與這個問題非常相似,并且包含許多您正在尋找的細節。


但是足以說,跟蹤任何這些都不是操作系統的工作。實際上,運行時庫或底層的內存管理器將跟蹤數組的大小。通常,這是通過在前面分配額外的內存并在該位置存儲數組的大小來完成的(大多數使用頭節點)。


通過執行以下代碼,這在某些實現中是可見的


int* pArray = new int[5];

int size = *(pArray-1);


查看完整回答
反對 回復 2019-10-05
  • 4 回答
  • 0 關注
  • 948 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號