double free
生活随笔
收集整理的這篇文章主要介紹了
double free
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
double free 內(nèi)存問題
標(biāo)簽:?stringbuffer多線程list語言c 2010-05-20 10:42?10963人閱讀?評(píng)論(0)?收藏?舉報(bào) ?分類: 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文件里面也看不出個(gè)所以然來,這對(duì)于一個(gè)大型的商業(yè)系統(tǒng)來說太令人恐怖了,事故隨時(shí)可能發(fā)生。 遇到棘手的問題,慌張是沒用的,解決不了任何問題。先坐下來,喝杯茶,舒緩一下神經(jīng)。 內(nèi)存問題始終是c++程序員需要去面對(duì)的問題,這也是c++語言的門檻較高的原因之一。通常我們會(huì)犯的內(nèi)存問題大概有以下幾種: 1.內(nèi)存重復(fù)釋放,出現(xiàn)double free時(shí),通常是由于這種情況所致。 2.內(nèi)存泄露,分配的內(nèi)存忘了釋放。 3.內(nèi)存越界使用,使用了不該使用的內(nèi)存。 4.使用了無效指針。 5.空指針,對(duì)一個(gè)空指針進(jìn)行操作。 對(duì)于第一種和第二種,第五種情況,就不用多說,會(huì)產(chǎn)生什么后果大家應(yīng)該都很清楚。 第四種情況,通常是指操作已釋放的對(duì)象,如: 1.已釋放對(duì)象,卻再次操作該指針?biāo)笇?duì)象。 2.多線程中某一動(dòng)態(tài)分配的對(duì)象同時(shí)被兩個(gè)線程使用,一個(gè)線程釋放了該對(duì)象,而另一線程繼續(xù)對(duì)該對(duì)象進(jìn)行操作。 我們重點(diǎn)探討第三種情況,相對(duì)于另幾種情況,這可以稱得上是疑難雜癥了(第四種情況也可以理解成內(nèi)存越界使用)。 內(nèi)存越界使用,這樣的錯(cuò)誤引起的問題存在極大的不確定性,有時(shí)大,有時(shí)小,有時(shí)可能不會(huì)對(duì)程序的運(yùn)行產(chǎn)生影響,正是這種不易重現(xiàn)的錯(cuò)誤,才是最致命的,一旦出錯(cuò)破壞性極大。 什么原因會(huì)造成內(nèi)存越界使用呢?有以下幾種情況,可供參考: 例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 ??? ???? 類似的還存在隱患的函數(shù)還有: ??? ??? strcat,vsprintf等 同樣,memcpy, memset, memmove等一些內(nèi)存操作函數(shù)在使用時(shí)也一定要注意。 ??? ???? 當(dāng)這樣的代碼一旦運(yùn)行,錯(cuò)誤就在所難免,會(huì)帶來的后果也是不確定的,通常可能會(huì)造成如下后果: 1.破壞了堆中的內(nèi)存分配信息數(shù)據(jù),特別是動(dòng)態(tài)分配的內(nèi)存塊的內(nèi)存信息數(shù)據(jù),因?yàn)椴僮飨到y(tǒng)在分配和釋放內(nèi)存塊時(shí)需要訪問該數(shù)據(jù),一旦該數(shù)據(jù)被破壞,以下的幾種情況都可能會(huì)出現(xiàn)。? ??? ??? *** 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.破壞了程序自己的其他對(duì)象的內(nèi)存空間,這種破壞會(huì)影響程序執(zhí)行的不正確性,當(dāng)然也會(huì)誘發(fā)coredump,如破壞了指針數(shù)據(jù)。 3.破壞了空閑內(nèi)存塊,很幸運(yùn),這樣不會(huì)產(chǎn)生什么問題,但誰知道什么時(shí)候不幸會(huì)降臨呢? 通常,代碼錯(cuò)誤被激發(fā)也是偶然的,也就是說之前你的程序一直正常,可能由于你為類增加了兩個(gè)成員變量,或者改變了某一部分代碼,coredump就頻繁發(fā)生,而你增加的代碼絕不會(huì)有任何問題,這時(shí)你就應(yīng)該考慮是否是某些內(nèi)存被破壞了。 排查的原則,首先是保證能重現(xiàn)錯(cuò)誤,根據(jù)錯(cuò)誤估計(jì)可能的環(huán)節(jié),逐步裁減代碼,縮小排查空間。 檢查所有的內(nèi)存操作函數(shù),檢查內(nèi)存越界的可能。常用的內(nèi)存操作函數(shù): sprintf snprintf? vsprintf vsnprintf strcpy strncpy strcat? memcpy memmove memset bcopy 如果有用到自己編寫的動(dòng)態(tài)庫的情況,要確保動(dòng)態(tài)庫的編譯與程序編譯的環(huán)境一致。 保持好的編碼習(xí)慣是杜絕錯(cuò)誤的最好方式! |
總結(jié)
以上是生活随笔為你收集整理的double free的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c memcpy 与 strcpy
- 下一篇: c printf 缓冲区分析