第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

delete []如何知道它是一個(gè)數(shù)組?

delete []如何知道它是一個(gè)數(shù)組?

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

4 回答

?
aluckdog

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。


查看完整回答
反對(duì) 回復(fù) 2019-10-05
?
動(dòng)漫人物

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)存塊)可能很重要。


查看完整回答
反對(duì) 回復(fù) 2019-10-05
?
當(dāng)年話下

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é),以查找分配的大小。


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


查看完整回答
反對(duì) 回復(fù) 2019-10-05
?
小唯快跑啊

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);


查看完整回答
反對(duì) 回復(fù) 2019-10-05
  • 4 回答
  • 0 關(guān)注
  • 955 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)