C++指針篇常見的錯誤

指針常見的錯誤

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)
  中止執行任務
複製代碼
相關文章
相關標籤/搜索