緩沖區(qū)溢出
緩沖區(qū)溢出是指當(dāng)計算機向緩沖區(qū)內(nèi)填充的數(shù)據(jù)位數(shù)超過了緩沖區(qū)本身的容量幌墓,溢出的數(shù)據(jù)覆蓋在合法數(shù)據(jù)上。理想的情況是程序檢查數(shù)據(jù)長度并不允許輸入超過緩沖區(qū)長度的字符,但是絕大多數(shù)程序都會假設(shè)數(shù)據(jù)長度總是與所分配的儲存空間相匹配,這就為緩沖區(qū)溢出埋下隱患攒至。
緩沖區(qū)溢出可能會造成嚴(yán)重的危害:如果被覆蓋的數(shù)據(jù)可能永遠丟失堕汞,如果被覆蓋的數(shù)據(jù)是非常重要的數(shù)據(jù)峻黍,那么結(jié)果可想而知复隆。但是如果覆蓋的數(shù)據(jù)是無用的,那么并不會造成影響姆涩。
舉個例子來說昏名,你為你的家人在一輛車上定了四個位置 ,但是現(xiàn)在你有五個家人上車阵面。這樣一來會有兩種情況:
1.你第五個家人做的位置原本沒人坐
2.你第五個家人把另一個人趕下車轻局,然后坐了他的位置。
1>被你趕下車的人是我样刷,問題不大仑扑,我也不會把你怎么樣(覆蓋無用數(shù)據(jù))。
2>被你趕下車的是周姐置鼻,問題大了镇饮,他可能會問候你的家人(覆蓋重要數(shù)據(jù))。
具體來說箕母,緩沖區(qū)溢出可分為堆緩沖區(qū)溢出和棧緩沖區(qū)溢出
棧緩沖區(qū)溢出
棧中存放的多是一些子函數(shù)的調(diào)用信息储藐。如果溢出,可能會覆蓋掉一些子函數(shù)調(diào)用的參數(shù)嘶是,那么就會導(dǎo)致程序無法從子函數(shù)中返回
堆緩沖區(qū)溢出
堆中是對內(nèi)存的分配钙勃,會有一些重要的數(shù)據(jù),如果溢出聂喇,那么這些數(shù)據(jù)可能會被覆蓋辖源,使得程序無法正常運行
內(nèi)存溢出
內(nèi)存溢出就是你要求分配的內(nèi)存超出了系統(tǒng)能給你的內(nèi)存,系統(tǒng)不能滿足需求希太,于是產(chǎn)生溢出克饶。
舉個例子來說,你爸有100萬誊辉,但是問你爸要1000萬矾湃,你爸給不起。
內(nèi)存泄漏
內(nèi)存泄漏是指你向系統(tǒng)申請分配內(nèi)存進行使用(malloc, new)堕澄,可是使用完了以后卻不歸還(free)邀跃,結(jié)果你申請到的那塊內(nèi)存你自己也不能再訪問(也許你把它的地址給弄丟了霉咨,或許是不想再用了),而系統(tǒng)也不能再次將它分配給需要的程序坞嘀。
舉個例子來說躯护,你找你爸借了10輛勞斯萊斯惊来,用完了丽涩,沒還給你爸。
內(nèi)存泄漏堆積會導(dǎo)致內(nèi)存溢出
還是上面的例子裁蚁,你找你爸借了10輛勞斯萊斯矢渊,用完了,沒還給你爸枉证,但是你也不再開了矮男。過了兩天,你又找你爸借十輛勞斯萊斯室谚,用完了毡鉴,又沒還,但是你也不再開了(內(nèi)存泄漏堆積)秒赤。又過了兩天猪瞬,你又找你爸借10輛勞斯萊斯,你爸說只有1輛了(內(nèi)存溢出)入篮。