🎈 作者:Linux猿
🎈 簡介:CSDN博客專家🏆,C/C++、面試、刷題、演算法盡管咨詢我,關注我,有問題私聊!
🎈 關注專欄: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 在定義時并沒有賦初值,這時候為野指標,
二、懸空指標
懸空指標是指 指標指向的記憶體空間已被釋放或不再有效,
有三種情況會產生懸空指標,下面結合實體來看一下:
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 的,
? 好文推薦 ?
【萬字整理】??8大排序演算法??【建議收藏】
??一文掌握C/C++記憶體泄漏,防止記憶體泄漏以及檢測工具!??
3分鐘理解指標和參考的區別【??建議收藏??】
【C/C++面試必備】宣告和定義的區別
🎈 歡迎小伙伴們點贊👍、收藏?、留言💬
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/292540.html
標籤:其他
上一篇:面向物件編程
下一篇:左旋字串
