C++野指針和懸空指針的實(shí)現(xiàn)方法
野指針和懸空指針是指針中常見(jiàn)的兩個(gè)概念,本文結(jié)合實(shí)例講解來(lái)講解下。
一、野指針
野指針是指尚未初始化的指針,既不指向合法的內(nèi)存空間,也沒(méi)有使用 NULL/nullptr 初始化指針。
來(lái)看一個(gè)簡(jiǎn)單例子:
#include <iostream> using namespace std; int main() { int *p; // 野指針 int *q = NULL; // 非野指針 p = new int(5); // p 現(xiàn)在不再是野指針 q = new int(10); cout<<"*p = "<<*p<<endl; cout<<"*q = "<<*q<<endl; free(p); free(q); return 0; }
輸出結(jié)果為:
linuxy@linuxy:~/wildPointer$ ./main
*p = 5
*q = 10
linuxy@linuxy:~/wildPointer$
p 在定義時(shí)并沒(méi)有賦初值,這時(shí)候?yàn)橐爸羔槨?/p>
二、懸空指針
懸空指針是指 指針指向的內(nèi)存空間已被釋放或不再有效。
有三種情況會(huì)產(chǎn)生懸空指針,下面結(jié)合實(shí)例來(lái)看一下:
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 的內(nèi)存空間,并不是變量 p,結(jié)合一個(gè)例子看下:
#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; }
輸出結(jié)果為:
linuxy@linuxy:~/wildPointer$ ./main
*p = 5
p 地址:0x55a885ef6eb0
p 地址:0x55a885ef6eb0
*p = 0
linuxy@linuxy:~/wildPointer$
可以看到, free 前后 p 的地址是不變的,free 釋放的是 p 指向的內(nèi)存空間,釋放后表示該快內(nèi)存可以重新分配了,至于 free 后 *p 的值,視不同編譯器情況而不同。
2.2 情況二
超出了變量的作用范圍。
#include <iostream> using namespace std; int main() { int *p; { int tmp = 10; p = &tmp; } //p 在此處成為懸空指針 return 0; }
在上述例了中,變量 tmp 的作用范圍為最近的一層括號(hào)內(nèi),在括號(hào)外引用便超出了變量的作用范圍。
2.3 情況三
指向了函數(shù)局部變量。
#include <iostream> using namespace std; int* getVal() { int tmp = 10; return &tmp; } int main() { int *p = getVal(); //懸空指針 cout<<"*p = "<<*p<<endl; return 0; }
在函數(shù) getVal 執(zhí)行完后,局部變量的內(nèi)存空間會(huì)被釋放,而這里 p 指向了函數(shù)內(nèi)的局部變量,p 便成為了懸空指針,可以將 tmp 變?yōu)?static 的。
到此這篇關(guān)于C++實(shí)現(xiàn)野指針和懸空指針的文章就介紹到這了,更多相關(guān)C++ 野指針和懸空指針內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MFC Frame-Splitter模型實(shí)例原理解析
這篇文章主要介紹了MFC Frame-Splitter模型實(shí)例原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07C語(yǔ)言中使用lex統(tǒng)計(jì)文本文件字符數(shù)
這篇文章主要介紹了C語(yǔ)言中使用lex統(tǒng)計(jì)文本文件字符數(shù),本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-04-04一起來(lái)學(xué)習(xí)C++中類(lèi)的this指針以使用
這篇文章主要為大家詳細(xì)介紹了C++中類(lèi)的this指針以使用,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-03-03c++ lambda捕獲this 導(dǎo)致多線程下類(lèi)釋放后還在使用的錯(cuò)誤問(wèn)題
Lambda表達(dá)式是現(xiàn)代C++的一個(gè)語(yǔ)法糖,挺好用的。但是如果使用不當(dāng),會(huì)導(dǎo)致內(nèi)存泄露或潛在的崩潰問(wèn)題,這里總結(jié)下c++ lambda捕獲this 導(dǎo)致多線程下類(lèi)釋放后還在使用的錯(cuò)誤問(wèn)題,感興趣的朋友一起看看吧2023-02-02基于Qt實(shí)現(xiàn)簡(jiǎn)易GIF播放器的示例代碼
這篇文章主要介紹了如何利用Qt設(shè)計(jì)一個(gè)簡(jiǎn)易GIF播放器,可以播放GIF動(dòng)畫(huà)。其基本功能有載入文件、播放、暫停、停止、快進(jìn)和快退,感興趣的可以了解一下2022-06-06C/C++題解LeetCode1295統(tǒng)計(jì)位數(shù)為偶數(shù)的數(shù)字
這篇文章主要為大家介紹了C/C++題解LeetCode1295統(tǒng)計(jì)位數(shù)為偶數(shù)的數(shù)字示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01C++多態(tài)特性之派生與虛函數(shù)與模板詳細(xì)介紹
這篇文章主要介紹了C++多態(tài)的特性派生與虛函數(shù)與模板,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2022-09-09排列和組合算法的實(shí)現(xiàn)方法_C語(yǔ)言經(jīng)典案例
下面小編就為大家?guī)?lái)一篇排列和組合算法的實(shí)現(xiàn)方法_C語(yǔ)言經(jīng)典案例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-09-09