內(nèi)存問題的相關(guān)概念

內(nèi)存泄漏:

分配的內(nèi)存不足以放下數(shù)據(jù)項序列,稱為內(nèi)存溢出。一個盤子 用盡各種方法只能裝4 個果子,你裝了5個偶摔,結(jié)果掉倒地上不能吃了。這就是溢出促脉!比方說棧辰斋,棧滿時再做進(jìn)棧必定產(chǎn)生空間溢出策州,叫上溢,椆蹋空時再做退棧也產(chǎn)生空間溢出够挂,稱為下溢。
以發(fā)生的方式來分類藕夫,內(nèi)存泄漏可以分為4 類:

  1. 常發(fā)性內(nèi)存泄漏孽糖。發(fā)生內(nèi)存泄漏的代碼會被多次執(zhí)行到,每次被
    執(zhí)行的時候都會導(dǎo)致一塊內(nèi)存泄漏毅贮。

  2. 偶發(fā)性內(nèi)存泄漏办悟。發(fā)生內(nèi)存泄漏的代碼只有在某些特定環(huán)境或操
    作過程下才會發(fā)生。常發(fā)性和偶發(fā)性是相對的滩褥。對于特定的環(huán)境病蛉,偶
    發(fā)性的也許就變成了常發(fā)性的。所以測試環(huán)境和測試方法對檢測內(nèi)存
    泄漏至關(guān)重要瑰煎。

  3. 一次性內(nèi)存泄漏铺然。發(fā)生內(nèi)存泄漏的代碼只會被執(zhí)行一次,或者由
    于算法上的缺陷酒甸,導(dǎo)致總會有一塊僅且一塊內(nèi)存發(fā)生泄漏魄健。比如,在
    類的構(gòu)造函數(shù)中分配內(nèi)存插勤,在析構(gòu)函數(shù)中卻沒有釋放該內(nèi)存沽瘦,所以內(nèi)
    存泄漏只會發(fā)生一次。

  4. 隱式內(nèi)存泄漏农尖。程序在運行過程中不停的分配內(nèi)存析恋,但是直到結(jié)
    束的時候才釋放內(nèi)存。嚴(yán)格的說這里并沒有發(fā)生內(nèi)存泄漏卤橄,因為最終
    程序釋放了所有申請的內(nèi)存。但是對于一個服務(wù)器程序臂外,需要運行幾
    天窟扑,幾周甚至幾個月,不及時釋放內(nèi)存也可能導(dǎo)致最終耗盡系統(tǒng)的所
    有內(nèi)存漏健。所以嚎货,我們稱這類內(nèi)存泄漏為隱式內(nèi)存泄漏。
    從用戶使用程序的角度來看蔫浆,內(nèi)存泄漏本身不會產(chǎn)生什么危害殖属,作為
    一般的用戶,根本感覺不到內(nèi)存泄漏的存在瓦盛。真正有危害的是內(nèi)存泄
    漏的堆積洗显,這會最終消耗盡系統(tǒng)所有的內(nèi)存外潜。從這個角度來說,一次
    性內(nèi)存泄漏并沒有什么危害挠唆,因為它不會堆積处窥,而隱式內(nèi)存泄漏危害
    性則非常大,因為較之于常發(fā)性和偶發(fā)性內(nèi)存,泄漏它更難被檢測到

====================================================

內(nèi)存越界:

何謂內(nèi)存訪問越界玄组,簡單的說滔驾,你向系統(tǒng)申請了一塊內(nèi)存,在使用這塊內(nèi)存的時候俄讹,超出了你申請的范圍哆致。

內(nèi)存越界使用,這樣的錯誤引起的問題存在極大的不確定性患膛,有時大摊阀,有時小,有時可能不會對程序的運行產(chǎn)生影響剩瓶,正是這種不易重現(xiàn)的錯誤驹溃,才是最致命的,一旦出錯破壞性極大延曙。

什么原因會造成內(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ù)在使用時也一定要注意布疙。

當(dāng)這樣的代碼一旦運行,錯誤就在所難免愿卸,會帶來的后果也是不確定的灵临,通常可能會造成如下后果:

1.破壞了堆中的內(nèi)存分配信息數(shù)據(jù)趴荸,特別是動態(tài)分配的內(nèi)存塊的內(nèi)存信息數(shù)據(jù)儒溉,因為操作系統(tǒng)在分配和釋放內(nèi)存塊時需要訪問該數(shù)據(jù),一旦該數(shù)據(jù)被破壞发钝,以下的幾種情況都可能會出現(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.破壞了程序自己的其他對象的內(nèi)存空間,這種破壞會影響程序執(zhí)行的不正確性酝豪,當(dāng)然也會誘發(fā)coredump涛碑,如破壞了指針數(shù)據(jù)。

3.破壞了空閑內(nèi)存塊孵淘,很幸運蒲障,這樣不會產(chǎn)生什么問題,但誰知道什么時候不幸會降臨呢?

通常揉阎,代碼錯誤被激發(fā)也是偶然的庄撮,也就是說之前你的程序一直正常,可能由于你為類增加了兩個成員變量余黎,或者改變了某一部分代碼重窟,coredump就頻繁發(fā)生,而你增加的代碼絕不會有任何問題惧财,這時你就應(yīng)該考慮是否是某些內(nèi)存被破壞了巡扇。

排查的原則,首先是保證能重現(xiàn)錯誤垮衷,根據(jù)錯誤估計可能的環(huán)節(jié)厅翔,逐步裁減代碼,縮小排查空間搀突。
檢查所有的內(nèi)存操作函數(shù)刀闷,檢查內(nèi)存越界的可能。常用的內(nèi)存操作函數(shù):

sprintf snprintf
vsprintf vsnprintf
strcpy strncpy strcat
memcpy memmove memset bcopy

如果有用到自己編寫的動態(tài)庫的情況仰迁,要確保動態(tài)庫的編譯與程序編譯的環(huán)境一致甸昏。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市徐许,隨后出現(xiàn)的幾起案子施蜜,更是在濱河造成了極大的恐慌,老刑警劉巖雌隅,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件翻默,死亡現(xiàn)場離奇詭異,居然都是意外死亡恰起,警方通過查閱死者的電腦和手機(jī)修械,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來检盼,“玉大人肯污,你說我怎么就攤上這事《滞鳎” “怎么了蹦渣?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長东羹。 經(jīng)常有香客問我剂桥,道長忠烛,這世上最難降的妖魔是什么属提? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上冤议,老公的妹妹穿的比我還像新娘斟薇。我一直安慰自己,他們只是感情好恕酸,可當(dāng)我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布堪滨。 她就那樣靜靜地躺著,像睡著了一般蕊温。 火紅的嫁衣襯著肌膚如雪袱箱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天义矛,我揣著相機(jī)與錄音发笔,去河邊找鬼。 笑死凉翻,一個胖子當(dāng)著我的面吹牛了讨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播制轰,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼前计,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了垃杖?” 一聲冷哼從身側(cè)響起男杈,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎缩滨,沒想到半個月后势就,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡脉漏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年苞冯,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片侧巨。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡舅锄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出司忱,到底是詐尸還是另有隱情皇忿,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布坦仍,位于F島的核電站鳍烁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏繁扎。R本人自食惡果不足惜幔荒,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一糊闽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧爹梁,春花似錦右犹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至积糯,卻和暖如春掂墓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背看成。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工梆暮, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人绍昂。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓啦粹,卻偏偏與公主長得像,于是被迫代替她去往敵國和親窘游。 傳聞我的和親對象是個殘疾皇子唠椭,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,802評論 2 345

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