日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

double free

發布時間:2025/3/21 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 double free 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

double free 內存問題

標簽:?stringbuffer多線程list語言c ?10963人閱讀?評論(0)?收藏?舉報 ?分類: C/C++(32)? double free 2008年06月02日 星期一 11:43
*** glibc detected *** free(): invalid pointer:
*** glibc detected *** malloc(): memory corruption:
*** glibc detected *** double free or corruption (out): 0x00000000005c18a0 ***
*** glibc detected *** corrupted double-linked list: 0x00000000005ab150 ***

你是否遇到過這樣的情況,太沮喪了,程序總是無端coredump,gdb到core文件里面也看不出個所以然來,這對于一個大型的商業系統來說太令人恐怖了,事故隨時可能發生。

遇到棘手的問題,慌張是沒用的,解決不了任何問題。先坐下來,喝杯茶,舒緩一下神經。

內存問題始終是c++程序員需要去面對的問題,這也是c++語言的門檻較高的原因之一。通常我們會犯的內存問題大概有以下幾種:

1.內存重復釋放,出現double free時,通常是由于這種情況所致。
2.內存泄露,分配的內存忘了釋放。
3.內存越界使用,使用了不該使用的內存。
4.使用了無效指針。
5.空指針,對一個空指針進行操作。


對于第一種和第二種,第五種情況,就不用多說,會產生什么后果大家應該都很清楚。

第四種情況,通常是指操作已釋放的對象,如:
1.已釋放對象,卻再次操作該指針所指對象。
2.多線程中某一動態分配的對象同時被兩個線程使用,一個線程釋放了該對象,而另一線程繼續對該對象進行操作。

我們重點探討第三種情況,相對于另幾種情況,這可以稱得上是疑難雜癥了(第四種情況也可以理解成內存越界使用)。

內存越界使用,這樣的錯誤引起的問題存在極大的不確定性,有時大,有時小,有時可能不會對程序的運行產生影響,正是這種不易重現的錯誤,才是最致命的,一旦出錯破壞性極大。

什么原因會造成內存越界使用呢?有以下幾種情況,可供參考:
例1:
??? ??? char buf[32] = {0};
??? ??? for(int i=0; i<n; i++)// n < 32 or n > 32
??? ??? {
??? ??? ??? buf[i] = 'x';
??? ??? }
??? ??? ....
??? ????
例2:
??? ??? char buf[32] = {0};
??? ??? string str = "this is a test sting !!!!";
??? ??? sprintf(buf, "this is a test buf!string:%s", str.c_str()); //out of buffer space
??? ??? ....
??? ????
例3:
??? ??? string str = "this is a test string!!!!";
??? ??? char buf[16] = {0};
??? ??? strcpy(buf, str.c_str()); //out of buffer space
??? ????
類似的還存在隱患的函數還有:
??? ??? strcat,vsprintf等

同樣,memcpy, memset, memmove等一些內存操作函數在使用時也一定要注意。
??? ????
當這樣的代碼一旦運行,錯誤就在所難免,會帶來的后果也是不確定的,通常可能會造成如下后果:

1.破壞了堆中的內存分配信息數據,特別是動態分配的內存塊的內存信息數據,因為操作系統在分配和釋放內存塊時需要訪問該數據,一旦該數據被破壞,以下的幾種情況都可能會出現。?
??? ??? *** glibc detected *** free(): invalid pointer:
??? ??? *** glibc detected *** malloc(): memory corruption:
??? ??? *** glibc detected *** double free or corruption (out): 0x00000000005c18a0 ***
??? ??? *** glibc detected *** corrupted double-linked list: 0x00000000005ab150 ***??? ????

2.破壞了程序自己的其他對象的內存空間,這種破壞會影響程序執行的不正確性,當然也會誘發coredump,如破壞了指針數據。

3.破壞了空閑內存塊,很幸運,這樣不會產生什么問題,但誰知道什么時候不幸會降臨呢?

通常,代碼錯誤被激發也是偶然的,也就是說之前你的程序一直正常,可能由于你為類增加了兩個成員變量,或者改變了某一部分代碼,coredump就頻繁發生,而你增加的代碼絕不會有任何問題,這時你就應該考慮是否是某些內存被破壞了。

排查的原則,首先是保證能重現錯誤,根據錯誤估計可能的環節,逐步裁減代碼,縮小排查空間。
檢查所有的內存操作函數,檢查內存越界的可能。常用的內存操作函數:
sprintf snprintf?
vsprintf vsnprintf
strcpy strncpy strcat?
memcpy memmove memset bcopy

如果有用到自己編寫的動態庫的情況,要確保動態庫的編譯與程序編譯的環境一致。

保持好的編碼習慣是杜絕錯誤的最好方式!

總結

以上是生活随笔為你收集整理的double free的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。