空指针、悬空指针、野指针
文章目錄
- 前言
- 一、指針?
- 二、指針的應(yīng)用場(chǎng)景
- 三、 空指針
- 四、 懸空指針
- 五、 野指針
- 正確用法
- 總結(jié)
前言
相信很多小伙伴對(duì)指針的使用都有一定的了解了。但更多的人可能對(duì)指針又愛(ài)又恨。這次我們談點(diǎn)重要的,進(jìn)一步加深對(duì)指針的理解
一、指針?
指針是一種特別變量,全稱(chēng)是指針變量,專(zhuān)用于存放其它變量在內(nèi)存中的地址編號(hào)。把指針指向具體的內(nèi)存變量的地址,就是對(duì)指針賦值。
二、指針的應(yīng)用場(chǎng)景
用作函數(shù)的參數(shù)傳遞和函數(shù)的返回值。 利用指針傳遞參數(shù),可避免變量復(fù)制,減少內(nèi)存開(kāi)銷(xiāo),提高效率。三、 空指針
沒(méi)有賦值的指針變量(沒(méi)有指向內(nèi)存變量的地址),對(duì)空指針操作會(huì)造成程序的段錯(cuò)誤(Core dump)
四、 懸空指針
指針指向的內(nèi)存已釋放,但指針的值沒(méi)有被清零,對(duì)懸空指針操作的結(jié)果不可預(yù)知
int main(void) {int*p=nullptr;int*p2=new int;p=p2;delete p2; }此時(shí)p和p2就是懸空指針,指向的內(nèi)存已經(jīng)被釋放。繼續(xù)使用這兩個(gè)指針,行為不可預(yù)知。需要設(shè)置為p=p2=nullptr。
解決辦法:指針free或delete之后及時(shí)置空。
五、 野指針
指的是沒(méi)有被初始化過(guò)的指針。
int main(void) {int*p;//未初始化std::cout<<*p<<std::endl;//未初始化就被使用return 0; }因此,為了防止出錯(cuò),對(duì)于指針初始化時(shí)都是賦值為nullptr,或置空,這樣在使用時(shí)編譯器就不會(huì)直接報(bào)錯(cuò),產(chǎn)生非法內(nèi)存訪問(wèn)。
正確用法
//關(guān)閉文件指針 void CFile::Close() {if(m_fp==0) return;//檢查是否為空指針,是則直接返回fclose(m_fp);//關(guān)閉文件指針,這代表著釋放了文件指針指向的內(nèi)存,此時(shí)指針就變成了懸空指針m_fp=0;//將懸空指針的值清零,避免隱藏bugmemset(m_filename,0,sizeof(m_filename));//如果存在臨時(shí)文件就刪除它if (strlen(m_filenametmp)!=0) remove(m_filenametmp);memset(m_filenametmp,0,sizeof(m_filenametmp)); }總結(jié)
對(duì)于指針使用大家要格外小心,寫(xiě)程序時(shí)仔細(xì)考慮清楚。
野指針和懸空指針都是指向無(wú)效內(nèi)存區(qū)域(這里的無(wú)效指的是"不安全不可控")的指針,訪問(wèn)行為將會(huì)導(dǎo)致未定義行為。
避免野指針比較簡(jiǎn)單,但懸空指針比較麻煩。c++引入了智能指針,C++智能指針的本質(zhì)就是避免懸空指針的產(chǎn)生。
總結(jié)
以上是生活随笔為你收集整理的空指针、悬空指针、野指针的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 实现strstr库函数功能
- 下一篇: 重温冒泡排序