两个吃奶一个添下面视频_人妻第一页香蕉网_欧美xxxx少妇_妺妺窝人体色www婷婷

  • 歡迎訪問C語言網(wǎng)www.sztianhecheng.cn 比賽欄每月有獎(jiǎng)月賽!舉辦比賽聯(lián)系QQ:2045302297
  • 問題反饋、粉絲交流 QQ群327452739 藍(lán)橋杯訓(xùn)練群:113766799 申請群時(shí)請備注排名里的昵稱
  • C語言研究中心 為您提供有圖、有料、解渴的C語言專題! 歡迎討論!

C語言free釋放內(nèi)存后為什么指針里的值不變?竟然還可以輸出?

C語言研究中心 CTO 20141次瀏覽 3個(gè)評論

想必大家都知道C語言中動態(tài)開辟內(nèi)存之后,必須要釋放內(nèi)存,來防止內(nèi)存泄露。也就是malloc之后,必須要free。正所謂”有借有還,再借不難”, 不少同學(xué)會問為什么釋放指針后,指向這塊內(nèi)存的指針的值不變呢,我們今天為大家揭秘。

 

首先,我們用malloc開辟一個(gè)內(nèi)存,用strcpy拷貝一串字符串,然后釋放掉,通過斷點(diǎn)調(diào)試進(jìn)行觀察!

下圖可以看到,在VC6編譯環(huán)境下,觀察指針p的指針?biāo)赶虻膬?nèi)容已經(jīng)被strcpy后改變

C語言free釋放內(nèi)存后為什么指針里的值不變?竟然還可以輸出?

 

下一步free函數(shù),我們選擇F11單步介入觀察,幸運(yùn)的是在VC6中可以看到源代碼,如下圖,會進(jìn)入到DBGHEAP.c文件中,會調(diào)用_free_dbg函數(shù),繼續(xù)F11介入觀察代碼

 

 

C語言free釋放內(nèi)存后為什么指針里的值不變?竟然還可以輸出?

 

多次單步之后,我們可以看到一個(gè)memset函數(shù),那么F10執(zhí)行這memset,觀察P指向的內(nèi)容,果然不出我們所料:

0x00970e38處的內(nèi)容已經(jīng)被0xDD覆蓋,如下圖紅色字部分。

 

C語言free釋放內(nèi)存后為什么指針里的值不變?竟然還可以輸出?

 

這里重點(diǎn)觀察了,這個(gè)memset函數(shù)我們應(yīng)該很熟悉,第二個(gè)參數(shù)即為要重置的內(nèi)容,這里我們可以轉(zhuǎn)到定義 處,或者搜索第二個(gè)參數(shù)_bDeadLandFill,可以看到有如下定義, 為0xDD

 

C語言free釋放內(nèi)存后為什么指針里的值不變?竟然還可以輸出?

 

怎么樣,大家看到這里應(yīng)該明白了吧!

 

我們這里是VC6編譯器下的環(huán)境,也有部分同學(xué)反映free之后內(nèi)容并未消失,這里我們分析可能是部分編譯器free函數(shù)實(shí)現(xiàn)原理不同,歡迎大家自行嘗試,并與我們交流。

而關(guān)于free之后,p的之后為何沒有改變,仍然還是這個(gè)原先堆空間的這個(gè)地址,原因在于free函數(shù)僅僅是將malloc申請的內(nèi)存釋放回去,所謂的釋放也就是告訴編譯器,這塊內(nèi)存已經(jīng)使用完畢,可以收回了。但指針?biāo)赶虻膬?nèi)存值,并不會發(fā)生改變。就可以比方說,你租了一套房子,到期后,房子收回歸還房東,而此時(shí)你可能還拿著房子的鑰匙,這個(gè)時(shí)候你雖然可以繼續(xù)訪問這個(gè)房子(內(nèi)存),但已經(jīng)不屬于你,是非法的。也可能有新的租客入駐更改房子的內(nèi)置,也可能還是這個(gè)樣子。取決于不同的房東(編譯器)和租客(內(nèi)容)。

這就是free釋放內(nèi)存后,指針內(nèi)地址仍然存在,但有時(shí)還可以訪問,有時(shí)候訪問輸出亂碼或輸出其他值的原因。

 

怎么樣,大家明白了嗎?

有任何問題,或新的發(fā)現(xiàn),歡迎聯(lián)系我們!

C語言研究中心(www.sztianhecheng.cn)

C語言網(wǎng)提供「C語言、C++、算法競賽」在線課程,全部由資深研發(fā)工程師或ACM金牌大佬親授課,更科學(xué)、全面的課程體系,以在線視頻+在線評測的學(xué)習(xí)模式學(xué)習(xí),學(xué)練同步,拒絕理論派,真正學(xué)會編程!還有獎(jiǎng)學(xué)金等增值福利等你!

C語言網(wǎng), 版權(quán)所有丨如未注明 , 均為原創(chuàng)丨本網(wǎng)站采用BY-NC-SA協(xié)議進(jìn)行授權(quán) , 轉(zhuǎn)載請注明C語言free釋放內(nèi)存后為什么指針里的值不變?竟然還可以輸出?
喜歡 (35)
[jinyangH@aliyun.com]
分享 (0)
發(fā)表我的評論
取消評論
表情

Hi,您需要填寫昵稱和郵箱!

  • 昵稱 (必填)
  • 郵箱 (必填)
(3)個(gè)小伙伴在吐槽
  1. 剛開始申請了100個(gè)字節(jié),然后free之后申請的內(nèi)存空間變成了dd,但是我數(shù)來數(shù)去填充dd的字節(jié)數(shù)有104個(gè)是怎么回事?
    Nrdesire2016-12-29 03:02 回復(fù)
    • debug環(huán)境下,編譯器會多初始化幾個(gè)字節(jié),用于檢測堆數(shù)據(jù)是否有越界訪問
      CTO2017-02-27 10:54 回復(fù)