C++野指針和懸空指針的實現方法
野指針和懸空指針是指針中常見的兩個概念,本文結合實例講解來講解下。
一、野指針
野指針是指尚未初始化的指針,既不指向合法的內存空間,也沒有使用 NULL/nullptr 初始化指針。
來看一個簡單例子:
#include <iostream> using namespace std; int main() { int *p; // 野指針 int *q = NULL; // 非野指針 p = new int(5); // p 現在不再是野指針 q = new int(10); cout<<"*p = "<<*p<<endl; cout<<"*q = "<<*q<<endl; free(p); free(q); return 0; }
輸出結果為:
linuxy@linuxy:~/wildPointer$ ./main
*p = 5
*q = 10
linuxy@linuxy:~/wildPointer$
p 在定義時並沒有賦初值,這時候為野指針。
二、懸空指針
懸空指針是指 指針指向的內存空間已被釋放或不再有效。
有三種情況會產生懸空指針,下面結合實例來看一下:
2.1 情況一
釋放指針資源後,未再次賦值前。
#include <iostream> using namespace std; int main() { int *p = new int(5); cout<<"*p = "<<*p<<endl; free(p); // p 在釋放後成為懸空指針 p = NULL; // 非懸空指針 return 0; }
p 指針在被 free 後,成為懸空指針,被 NULL 賦值後不再是懸空指針。
註意:這裡 free 掉的是 p 的內存空間,並不是變量 p,結合一個例子看下:
#include <iostream> using namespace std; int main() { int *p = new int(5); cout<<"*p = "<<*p<<endl; cout<<"p 地址:"<<p<<endl; free(p); // p 在釋放後成為懸空指針 cout<<"p 地址:"<<p<<endl; cout<<"*p = "<<*p<<endl; p = NULL; // 非懸空指針 return 0; }
輸出結果為:
linuxy@linuxy:~/wildPointer$ ./main
*p = 5
p 地址:0x55a885ef6eb0
p 地址:0x55a885ef6eb0
*p = 0
linuxy@linuxy:~/wildPointer$
可以看到, free 前後 p 的地址是不變的,free 釋放的是 p 指向的內存空間,釋放後表示該快內存可以重新分配瞭,至於 free 後 *p 的值,視不同編譯器情況而不同。
2.2 情況二
超出瞭變量的作用范圍。
#include <iostream> using namespace std; int main() { int *p; { int tmp = 10; p = &tmp; } //p 在此處成為懸空指針 return 0; }
在上述例瞭中,變量 tmp 的作用范圍為最近的一層括號內,在括號外引用便超出瞭變量的作用范圍。
2.3 情況三
指向瞭函數局部變量。
#include <iostream> using namespace std; int* getVal() { int tmp = 10; return &tmp; } int main() { int *p = getVal(); //懸空指針 cout<<"*p = "<<*p<<endl; return 0; }
在函數 getVal 執行完後,局部變量的內存空間會被釋放,而這裡 p 指向瞭函數內的局部變量,p 便成為瞭懸空指針,可以將 tmp 變為 static 的。
到此這篇關於C++實現野指針和懸空指針的文章就介紹到這瞭,更多相關C++ 野指針和懸空指針內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- C++ 命名空間 using聲明使用示例詳解
- C++ 程序流程結構詳解
- C++11中longlong超長整型和nullptr初始化空指針
- C和C++的區別詳解
- C/C++自主分配出現double free or corruption問題解決