code c double free or corruption

【轉(zhuǎn):http://blog.csdn.net/wclin88/article/details/7276972

*** 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++語(yǔ)言的門檻較高的原因之一撮弧。通常我們會(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)生什么問題狸窘,但誰(shuí)知道什么時(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)庫(kù)的情況洽糟,要確保動(dòng)態(tài)庫(kù)的編譯與程序編譯的環(huán)境一致。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末堕战,一起剝皮案震驚了整個(gè)濱河市坤溃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌嘱丢,老刑警劉巖薪介,帶你破解...
    沈念sama閱讀 222,729評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異越驻,居然都是意外死亡汁政,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門缀旁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來烂完,“玉大人,你說我怎么就攤上這事诵棵。” “怎么了祝旷?”我有些...
    開封第一講書人閱讀 169,461評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵履澳,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我怀跛,道長(zhǎng)距贷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,135評(píng)論 1 300
  • 正文 為了忘掉前任吻谋,我火速辦了婚禮忠蝗,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘漓拾。我一直安慰自己阁最,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評(píng)論 6 398
  • 文/花漫 我一把揭開白布骇两。 她就那樣靜靜地躺著速种,像睡著了一般。 火紅的嫁衣襯著肌膚如雪低千。 梳的紋絲不亂的頭發(fā)上配阵,一...
    開封第一講書人閱讀 52,736評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼棋傍。 笑死救拉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的瘫拣。 我是一名探鬼主播亿絮,決...
    沈念sama閱讀 41,179評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼拂铡!你這毒婦竟也來了壹无?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,124評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤感帅,失蹤者是張志新(化名)和其女友劉穎斗锭,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體失球,經(jīng)...
    沈念sama閱讀 46,657評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡岖是,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了实苞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片豺撑。...
    茶點(diǎn)故事閱讀 40,872評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖黔牵,靈堂內(nèi)的尸體忽然破棺而出聪轿,到底是詐尸還是另有隱情,我是刑警寧澤猾浦,帶...
    沈念sama閱讀 36,533評(píng)論 5 351
  • 正文 年R本政府宣布陆错,位于F島的核電站,受9級(jí)特大地震影響金赦,放射性物質(zhì)發(fā)生泄漏音瓷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評(píng)論 3 336
  • 文/蒙蒙 一夹抗、第九天 我趴在偏房一處隱蔽的房頂上張望绳慎。 院中可真熱鬧,春花似錦漠烧、人聲如沸杏愤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)声邦。三九已至,卻和暖如春摆舟,著一層夾襖步出監(jiān)牢的瞬間亥曹,已是汗流浹背邓了。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留媳瞪,地道東北人骗炉。 一個(gè)月前我還...
    沈念sama閱讀 49,304評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蛇受,于是被迫代替她去往敵國(guó)和親句葵。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容