1 內存泄漏c++
形成內存泄漏的幾種狀況:程序員
①經過c語言的malloc系統函數以及c++的new運算符動態內配的內存空間,使用完以後程序員沒有手動釋放! ②在有異常處理的程序中,即時使用了free或者delete可是因爲異常的緣由沒有獲得執行編程
/* 這裏提供一段僞代碼 */
try{
type* pointer = malloc(sizeof(type));
//此處拋出異常
free(pointer); //這裏不會執行
}catch(...){
//捕捉到異常
}
複製代碼
2 野指針的使用bash
基本概念:野指針指的是指向"垃圾"內存的指針函數
指針變成野指針的狀況概述:ui
①free或者delete以後的指針,free和delete只是釋放了該指針指向的內存空間,"可是該指針的值仍是malloc或者new分配的內存的地址",繼續使用它去訪問這個內存地址是會發生錯誤的!spa
注意:當釋放掉動態內存空間以後,將先前指向它的指針的值設置爲NULL;在建立指針變量的時候,給指針一個初始值,由於不指定初始值的話,指針的值是隨機的,這有時候會致使不可預期的錯誤!指針
建議:定義指針變量的時候儘可能初始化,哪怕初始化爲NULL也好;這是一個很好的編程習慣!code
②將局部變量的地址返回生命週期
出現的問題:由於a是局部變量,只有在func函數做用域中有效,它的內存空間是屬於棧內存的,一旦func執行完以後,系統會自動回收它的內存空間,因此再次使用的話會發生錯誤!
解決方法:將局部變量使用static修飾,由於在c++中,static修飾的變量的生命週期是整個程序運行期間,與程序"同生共死";
int* func(){
int a = 8;
return &a;
}
int main(){
int* p = func();
cout<<"p:"<<*p<<"\n";
}
複製代碼
3 NULL指針
出現NULL指針的狀況
①使用malloc或者new動態分配內存的時候:
對於malloc和new來講,當內存分配失敗的時候回返回NULL,因此若是不作判斷的話就會發生錯誤;
②當使用指針做爲函數的參數的時候:
對於含有指針參數的函數來講,當使用者傳入一個NULL的指針的話也是會發生錯誤的;
注意:爲了不以上兩種狀況的發生,咱們再程序中加一個if判斷
if (pointer == NULL)
中止執行任務
複製代碼