C 裡 delete 指標兩次會怎麼樣?

時間 2021-05-30 12:36:11

1樓:張一峰

我在想有沒有這樣的操作,delete 之後,賦值給乙個非常特殊的值(保證不會和正常的衝突),然後再次delete後丟擲乙個明確的異常,用於除錯問題

2樓:

動態分配記憶體後,object會被儲存在heap裡,這一塊內存在delete之前不會被其他object占用。delete之後,這塊記憶體會被釋放,程式可能會把這塊記憶體用作其他用處,所以delete的時候會崩潰。我試了幾次double delete都是崩潰的,但是我們教授說的是most of times, 所以也可能機緣巧合正好delete掉乙個object。

但這樣程式肯定還是會出問題的。

最安全的做法是,第一次delete之後,把這個指標賦值為nullptr。

因為c++ delete nullptr 不會有任何操作。說不應該設為nullptr的,可能是個人習慣使然。但是設定為nullptr是比較標準的做法。

3樓:李白

個人感覺在乙個位址上分配了乙個空間。

當delete之後,這個空間被程式放棄。

當你在new乙個記憶體時,又分配了乙個空間,如果此時的空間的位址與原先的位址相同。

那麼在delete就把這個空間放棄了。

於是產生乙個牛頭不對馬嘴的錯誤。

4樓:李家豪

C++ 本身沒有明確定義會發生什麼(未定義行為)但是編譯器定義了。

可以參閱編譯器文件

i686-unknown-linux-gcc 給出的結果是 segmentation fault (core dumped)

其他編譯器請自行實驗(逃

5樓:坐下坐下基本操作

雖然問題過去了很久,上面前輩的回答也都有各家的道理,我說一下自己的拙見.

在多執行緒並且還和一些C庫(比如說libevent等等)打交道的時候,延時釋放一些資源,非常重要,所以,不談對與不對,我認為,這和使用的場景很有關係.

6樓:Flanker Edward

Double free呀,這就是安全漏洞,可以被利用的了。

這裡列舉了乙個例子:http://

zhuanlan /p/21944830

7樓:7099

題主:啊啊啊啊我好害怕怎麼辦!!!電腦:來吧,這點小事我死不掉的!

題主:(哆哆嗦嗦)好....我....試....試....

電腦:boom!

8樓:陳碩

delete 之後賦值 nullptr 絕對是壞習慣,會掩蓋真實的錯誤。也不利於使用各種 memory checker 工具找出錯誤。

類似的還有為了防止 double free 而在 free 之後賦值 NULL,一樣是錯誤的。

在 C++ 裡,任何資源釋放的操作都應該在析構函式裡進行,這樣只要管好物件生命期就不會有資源洩漏了。

9樓:dyntkj

// Passed test on g++ && CL.EXE/* Output:

1st deleted p

2nd deleted p

p is assigned to NULL3rd deleted p

1st deleted q

2nd deleted q

q is assigned to NULL3rd deleted q

*/#include

using

namespace

std;

intmain

(void

)不要問我為什麼,其實我也不知道為什麼,但是千萬不要在實際中delete同乙個指標N多次(No zuo no die)

C語言版我也試了,同樣的結果。(附原始碼)

#include

#include

intmain

(void)

10樓:

個人認為delete之後是不是置null只是一種取捨。

但是:不管如何選擇,請務必保持一致!

不管如何選擇,請務必保持一致!

不管如何選擇,請務必保持一致!

如果不置null,就讓所有該panic的地方都能正確地panic掉,然後設計一套清晰、嚴格且可測試的資源管理體系,delete嚴格和new對應。

如果置null,就讓指標帶有「持有」的語義,像智慧型指標那樣在每次使用、銷毀時都做同樣的檢查和處理。

11樓:丁冬

和題目不是太相關, @可知不可知和 @叛逆者都給出了delete後一定要置空指標的建議,很怕這種觀念又成為了某種教條。

舉個例子:

~scoped_ptr

()// never throws

這是boost::scoped_ptr的實現,checked_delete只是增加了對incomplete type的檢查:

template

T>inline

void

checked_delete(T

*x)可以看見boost::scoped_ptr根本沒有對delete後的指標進行置空,如果boost::scoped_ptr真的把其持有的指標置空,反而可能掩蓋類似這樣的錯誤:

boost::scoped_ptr sp(new MyClass);

// some code

sp.~boost::scoped_ptr();

// by the end of the scope, sp counld be destructed again

按理說任何乙個非trivial的有效物件被多次析構都應該是明顯的邏輯錯誤,構造和析構必須是一一對應的。這樣的錯誤也許一般使用者很少遇到,因為顯式呼叫析構函式往往都是庫作者幹的事,但這不代表這種奇怪的錯誤完全不會發生。很不幸的是,對於這種邏輯錯誤開發者往往沒有特別好的手段可以規避掉,二次delete乙個懸垂指標行為是未定義的,也就是說錯誤是有可能被隱藏的。

但是如果boost::scoped_ptr幫你把px給置空了,結果只會更糟糕:這下錯誤鐵定是被徹底隱藏了,根本別想找輕易到。

沒有置空的話好歹有一定概率會崩潰給你看呢。

當然「delete後置空指標」這種教條能流傳這麼久,肯定是有它的道理的。關於到底什麼時候需要置空指標,關鍵之處在於搞清楚置空指標到底解決了什麼問題。先來理一下nullptr和野指標/懸垂指標的區別:

解引用:

nullptr:未定義

野指標/懸垂指標:未定義

delete

nullptr:良好定義,delete什麼也不用做

野指標/懸垂指標:未定義

值:nullptr:明確

野指標/懸垂指標:未定義,無法確定

可以發現nullptr最大的優勢在於值是明確的,也就是說分辨乙個指標是不是nullptr比分辨乙個指標是不是野指標/懸垂指標要容易得多。那delete後置空指標的最大價值就在於明確資源當前狀態。你想判斷乙個資源是否有效時,你當然沒法直接跑去看這個資源在不在,而是得詢問資源的持有者是否仍然持有這個資源。

如果所有被delete的指標都被置為nullptr,以後再去訪問這個指標的時候,我們可以通過其與nullptr的比較輕鬆判斷出資源是否已經被delete。

當然,這個優勢基於乙個重要的前提:在設計上允許在資源已經失效的情況下,資源的持有者保持有效。如果資源的持有者也被乾掉了,那即使你想通過nullptr判斷資源是否存在,你也找不到持有資源的指標進行比較。

至此,我們至少可以得出乙個結論,如果物件是和持有其的指標一同銷毀的,那置空指標就是脫褲子放屁。這個結論還可以引申一下:如果資源與其所有的持有者(含弱引用)一同被銷毀,那即將消亡的持有者們都沒有必要,也沒有能力為資源的後續狀態負責

其實delete/free後置空這樣的教條已經幾乎走上了和goto-label之流一樣的道路,很多人看到了前輩們留下的經驗之談,妄圖死記住口口相傳的best-practice,卻忘記了前因後果

12樓:fyy cloud

這樣做的話會導致heap corruption, 但程式有可能沒什麼症狀,還能繼續執行。一段時間後就會突然崩潰,這是一種相當難除錯的問題。

可以看這個文件。

Heap Corruptions

13樓:叛逆者

試一試怎麼了,死的是程式,又不會是系統、電腦、或開發者。以後路還長著,連這個最簡單最基本的都不敢試的話,以後會遇到更多麻煩。

另一方面,你不能通過一次試的結果得出結論。因為那只能說明在特定編譯器、特定crt下的結果。原理上你得知道delete是不改變指標值的。

所以第二次delete的時候,行為未定義,什麼事情都可能發生。好習慣永遠是delete之後立刻賦nullptr。這樣即便意外第二次delete了,也沒關係,因為delete nullptr是有良好定義的。

兩次國考,兩次進麵,兩次失敗,心理崩潰,該怎麼辦呀太絕望了?

愛笑姑娘 沒有關係的,勝敗乃兵家常事,如果題主真的想要上哪編制的話,我建議如果題主不試一試事業單位考試,我覺得事業單位不比公務員差,我之前也想著考公務員,可是當我上岸省直事業單位之後,過的不比我閨蜜差,我閨蜜子縣里做公務員,她現在都羨慕我離家近,工作輕鬆,工資還高,所以題主想轉戰事業單位,可以接著往...

怎麼實現連續兩次入境澳門?

Sunlight 出境是可以在澳門中轉的吧。單純過境香港或澳門是不需要港澳通行證和港澳港簽注。只需要持有中國護照 聯程機票 機票行程單也可 第三國有效簽證,就可以在香港來回停留7天,澳門30天內首次7天,30天內第二次則2天。目錄1 過境香港 來去均是7天 2 過境澳門 30天內首次7天,30天內第...

科目二掛了兩次 怎麼辦?

星辰大海 今天科二掛了第二次 20210203第一次考試第一把側方位右打死後熄火第二把沒對準點倒庫右邊車身壓線 20210219第一把倒庫右打死熄火第二把倒庫左邊壓線 平時練的時候我真的不算差的,考試緊張一方面吧,我們考試現在只能看點不能上車模擬,車子離合器不習慣,感覺莫名其妙熄火,開始前試車的時候...