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

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

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

C語言研究中心 CTO 20139次瀏覽 3個評論

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

 

首先,我們用malloc開辟一個內存,用strcpy拷貝一串字符串,然后釋放掉,通過斷點調試進行觀察!

下圖可以看到,在VC6編譯環(huán)境下,觀察指針p的指針所指向的內容已經被strcpy后改變

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

 

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

 

 

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

 

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

0x00970e38處的內容已經被0xDD覆蓋,如下圖紅色字部分。

 

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

 

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

 

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

 

怎么樣,大家看到這里應該明白了吧!

 

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

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

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

 

怎么樣,大家明白了嗎?

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

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

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

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

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

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