您好,登錄后才能下訂單哦!
本篇內容主要講解“怎么用C++實現野指針和懸空指針”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“怎么用C++實現野指針和懸空指針”吧!
一、野指針
二、懸空指針
2.1 情況一
2.2 情況二
2.3 情況三
野指針和懸空指針是指針中常見的兩個概念,本文結合實例講解來講解下。
野指針是指尚未初始化的指針,既不指向合法的內存空間,也沒有使用 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 在定義時并沒有賦初值,這時候為野指針。
懸空指針是指 指針指向的內存空間已被釋放或不再有效。
有三種情況會產生懸空指針,下面結合實例來看一下:
釋放指針資源后,未再次賦值前。
#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 的值,視不同編譯器情況而不同。
超出了變量的作用范圍。
#include <iostream> using namespace std; int main() { int *p; { int tmp = 10; p = &tmp; } //p 在此處成為懸空指針 return 0; }
在上述例了中,變量 tmp 的作用范圍為最近的一層括號內,在括號外引用便超出了變量的作用范圍。
指向了函數局部變量。
#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++實現野指針和懸空指針”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。