C++野指針和懸空指針的實現(xiàn)方法
野指針和懸空指針是指針中常見的兩個概念,本文結(jié)合實例講解來講解下。
一、野指針
野指針是指尚未初始化的指針,既不指向合法的內(nèi)存空間,也沒有使用 NULL/nullptr 初始化指針。
來看一個簡單例子:
#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 在定義時并沒有賦初值,這時候為野指針。
二、懸空指針
懸空指針是指 指針指向的內(nèi)存空間已被釋放或不再有效。
有三種情況會產(chǎn)生懸空指針,下面結(jié)合實例來看一下:
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é)合一個例子看下:
#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 的作用范圍為最近的一層括號內(nèi),在括號外引用便超出了變量的作用范圍。
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)存空間會被釋放,而這里 p 指向了函數(shù)內(nèi)的局部變量,p 便成為了懸空指針,可以將 tmp 變?yōu)?static 的。
到此這篇關(guān)于C++實現(xiàn)野指針和懸空指針的文章就介紹到這了,更多相關(guān)C++ 野指針和懸空指針內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
利用C語言編寫一個十六進(jìn)制日志轉(zhuǎn)換工具
這篇文章主要為大家詳細(xì)介紹了如何利用C語言編寫一個十六進(jìn)制日志轉(zhuǎn)換工具,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-11-11
C++開發(fā)的Redis數(shù)據(jù)導(dǎo)入工具優(yōu)化
這篇文章主要介紹了C++開發(fā)的Redis數(shù)據(jù)導(dǎo)入工具優(yōu)化方法的相關(guān)資料,需要的朋友可以參考下2015-07-07
C++實現(xiàn)將圖片轉(zhuǎn)換為馬賽克效果的示例代碼
這篇文章主要為大家詳細(xì)介紹了C++如何實現(xiàn)將圖片轉(zhuǎn)換為馬賽克效果,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,感興趣的小伙伴可以了解一下2023-01-01
Qt實現(xiàn)網(wǎng)易云音樂進(jìn)度條效果
這篇文章主要為大家詳細(xì)介紹了Qt實現(xiàn)網(wǎng)易云音樂進(jìn)度條效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-08-08
C語言非遞歸算法解決快速排序與歸并排序產(chǎn)生的棧溢出
上期我們講完了排序算法下,不知道小伙伴們有沒有發(fā)現(xiàn)一個問題,快速排序和歸并排序我們都是用遞歸來實現(xiàn)的,可能有小伙伴會問,如果說數(shù)據(jù)量很多話,棧區(qū)空間會不會不夠用呢?這期我們就來解決使用遞歸實現(xiàn)的排序?qū)е聴R绯鋈绾谓鉀Q2022-04-04

