跟前輩交流收穫心德,使用非常精煉的形式描述記憶體洩露與野指標的本質。在此與大家分享,歡迎多多交流。
下面給出理解描述:
指標變數作用域
被指向物件生命週期
造成的結果
情況一 超出作用域 生命週期未結束 記憶體洩露
情況二 在作用域內 生命週期結束 野指標
情況三 超出作用域 生命週期結束 正確的執行
情況一**片段舉例:
當上述**執行完成時,程式離開指標變數a的作用域,這時a會自動被系統**,但a當初所指向的物件a的生命週期卻沒有結束,因為沒有進行釋放操作,會一直占用一塊堆記憶體,直到程式程序退出才會釋放。這樣就出現了記憶體洩露。如果這樣的**還處在乙個被高頻率執行的環境下(如迴圈體中),那麼系統記憶體消耗將不斷增加到最後系統沒有可分配的記憶體空間,系統崩潰。
情況二**片段舉例:
}在指標變數b的作用域內,所指向的物件a的生命週期被delete a結束掉,相應的堆記憶體釋放,導致指標b成為了野指標。
補充閱讀:
C 記憶體洩露之野指標
寫出本文僅僅是處於備忘的目的。最近為現在做的軟體新增了乙個記憶體 機制 以前處於某種記憶體只申請不釋放,這並不等於記憶體洩露,因為我們知道這些記憶體塊在記憶體中的位置 在某一塊記憶體不使用的時候將其釋放掉,以防止記憶體緩慢增長。由於以前沒有釋放記憶體,所以就不存在野指標的問題。於是乎肯定坑爹的事情就...
記憶體洩露與野指標的思考
資料大小與指標大小?int a sizeof char a的值為1.int b sizeof char b的值隨編譯器和作業系統改變。在win32系統,應該是4.32位定址 即4byte。不應妄自揣度記憶體大小 struct mystruct long takes 4byte int takes 2...
記憶體洩漏與野指標
當你要為變數a申請一塊記憶體空間的時候,需要用到malloc函式。如何申請這塊記憶體空間呢?這就變成程式的工作了。程式首先會向系統申請一塊記憶體空間,然後程式會把申請好的這塊記憶體空間的首位址賦給變數a,假設這時候變數a拿到的首位址為0x1234,如果我們現在要對變數a進行迴圈操作,那麼每迴圈一次,...