亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

c++野指針的原理以及避免方法

 更新時(shí)間:2020年08月12日 10:59:08   作者:Dabelv  
這篇文章主要介紹了c++野指針的原理以及避免方法,幫助大家更好的學(xué)習(xí)和理解c++,感興趣的朋友可以了解下

1.定義

指向非法的內(nèi)存地址指針叫作野指針(Wild Pointer),也叫懸掛指針(Dangling Pointer),意為無(wú)法正常使用的指針。

2.出現(xiàn)野指針的常見(jiàn)情形

2.1使用未初始化的指針

出現(xiàn)野指針最典型的情形就是在定義指針變量之后沒(méi)有對(duì)它進(jìn)行初始化,如下面的程序。

#include <iostream>
using namespace std;

int main()
{
  int* p;
  cout<<*p<<endl; //編譯通過(guò),運(yùn)行時(shí)出錯(cuò)
}

2.2指針?biāo)傅膶?duì)象已經(jīng)消亡

指針指向某個(gè)對(duì)象之后,當(dāng)這個(gè)對(duì)象的生命周期已經(jīng)結(jié)束,對(duì)象已經(jīng)消亡后,仍使用指針訪問(wèn)該對(duì)象,將出現(xiàn)運(yùn)行時(shí)錯(cuò)誤??疾烊缦鲁绦?。

#include <iostream>
using namespace std;

int* retAddr()
{
  int num=10;
  return &num;
}

int main()
{
  int* p=NULL;
  p=retAddr();
  cout<<&p<<endl;
  cout<<*p<<endl;
}

以上程序編譯和運(yùn)行都沒(méi)有錯(cuò)誤,輸出結(jié)果如下:

001AFD48
1701495776

最后一行,輸出的并非想象中的num的值10,因?yàn)樽兞縩um是存儲(chǔ)在??臻g的局部變量,離開(kāi)函數(shù)超出其作用域后就會(huì)被釋放掉,因此輸出的值就是不確定的值了。

注意:
 (1)如果將cout<<&p<< endl;注釋掉,可以正常輸出num的值為10,或者將cout<<*p<<endl;放在前面,也能正常輸出,原因是局部變量num的內(nèi)存空間雖然在函數(shù)retAddr()調(diào)用結(jié)束后被回收,但是其值還沒(méi)有被修改,語(yǔ)句cout<<&p<<endl;實(shí)際上是調(diào)用cout對(duì)象的成員函數(shù)ostream& operator<<(),重新使用了retAddr()調(diào)用時(shí)使用的棧空間,此時(shí)num的內(nèi)存空間被改寫(xiě),輸出了不確定值。

(2)修改p指向的內(nèi)存空間的值,可以正常編譯運(yùn)行。

int main()
{
  int* p = NULL;
  p = retAddr();
  *p = 11;
  cout << *p << endl;
}

上面的代碼輸出11。這里p指向的地址空間雖然不屬于main函數(shù)的??臻g,但是操作系統(tǒng)在程序運(yùn)行時(shí)會(huì)預(yù)先開(kāi)辟一段可用的??臻g,供用戶(hù)程序使用。一般情況下,Windows默認(rèn)為1M,Linux默認(rèn)為10M,預(yù)先開(kāi)辟的??臻g并不是系統(tǒng)保護(hù)性地址,可以由程序任意改寫(xiě)并訪問(wèn),所以可以更改p指向的內(nèi)存空間的值并訪問(wèn)輸出。

2.3指針釋放后之后未置空

指針p被free或者delete之后,沒(méi)有置為NULL,讓人誤以為p是個(gè)合法的指針。對(duì)指針進(jìn)行free和delete,只是把指針?biāo)傅膬?nèi)存空間給釋放掉,但并沒(méi)有把指針本身置空,此時(shí)指針指向的就是“垃圾”內(nèi)存。釋放后的指針應(yīng)立即將指針置為NULL,防止產(chǎn)生野指針??疾烊缦鲁绦?。

#include <iostream>
using namespace std;

int main()
{
  int* p=NULL;
  p=new int[10];
  delete p;
  cout<<"p[0]:"<<p[0]<<endl;
}

程序輸出結(jié)果是一個(gè)隨機(jī)值,因?yàn)榇藭r(shí)的指針?biāo)赶虻目臻g是垃圾內(nèi)存,存放著隨機(jī)值。

3.如何避免野指針的出現(xiàn)

野指針有時(shí)比較隱蔽,編譯器不能發(fā)現(xiàn),為了防止野指針帶來(lái)的危害,開(kāi)發(fā)人員應(yīng)該注意以下幾點(diǎn)。
 (1)C++引入了引用機(jī)制,如果使用引用可以達(dá)到編程目的,就可以不必使用指針。因?yàn)橐迷诙x的時(shí)候,必須初始化,所以可以避免野指針的出現(xiàn)。

(2)如果一定要使用指針,那么需要在定義指針變量的同時(shí)對(duì)它進(jìn)行初始化操作。定義時(shí)將其置位NULL或者指向一個(gè)有名變量。

(3)對(duì)指針進(jìn)行free或者delete操作后,將其設(shè)置為NULL。對(duì)于使用 free 的情況,常常定義一個(gè)宏或者函數(shù) xfree 來(lái)代替 free 置空指針:

#define xfree(x) free(x); x = NULL;

以上就是c++野指針的原理以及避免方法的詳細(xì)內(nèi)容,更多關(guān)于c++ 野指針的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C語(yǔ)言利用EasyX繪制小企鵝表情包

    C語(yǔ)言利用EasyX繪制小企鵝表情包

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言如何利用EasyX繪圖庫(kù)實(shí)現(xiàn)繪制可愛(ài)的小企鵝表情包,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-12-12
  • C++高精度計(jì)時(shí)的幾種方法總結(jié)(測(cè)試函數(shù)運(yùn)行時(shí)間)

    C++高精度計(jì)時(shí)的幾種方法總結(jié)(測(cè)試函數(shù)運(yùn)行時(shí)間)

    本文介紹了C++中常用的幾種程序計(jì)時(shí)方法,包括clock()函數(shù)、GetTickCount()、QueryPerformanceCounter()以及C++11中的chrono庫(kù)函數(shù),這篇文章主要介紹了C++高精度計(jì)時(shí)的幾種方法,需要的朋友可以參考下
    2024-09-09
  • 一起聊聊C++中的特殊成員函數(shù)

    一起聊聊C++中的特殊成員函數(shù)

    在C#中要說(shuō)類(lèi)默認(rèn)給我們定義的特殊成員函數(shù),莫過(guò)于構(gòu)造函數(shù),但在?C++?中這樣的特殊函數(shù)高達(dá)6種,本文就整合一下和大家一起聊一聊
    2022-07-07
  • C語(yǔ)言實(shí)現(xiàn)萬(wàn)年歷源碼

    C語(yǔ)言實(shí)現(xiàn)萬(wàn)年歷源碼

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)萬(wàn)年歷源碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • C++實(shí)現(xiàn)寵物商店信息管理系統(tǒng)

    C++實(shí)現(xiàn)寵物商店信息管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)寵物商店信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Qt實(shí)現(xiàn)小功能之圓形進(jìn)度條的方法詳解

    Qt實(shí)現(xiàn)小功能之圓形進(jìn)度條的方法詳解

    在Qt自帶的控件中,只有垂直進(jìn)度條、水平進(jìn)度條兩種。在平時(shí)做頁(yè)面開(kāi)發(fā)時(shí),有些時(shí)候會(huì)用到圓形進(jìn)度條,比如說(shuō):下載某個(gè)文件的下載進(jìn)度。本文就來(lái)實(shí)現(xiàn)一個(gè)圓形進(jìn)度條,需要的可以參考一下
    2022-10-10
  • C語(yǔ)言實(shí)現(xiàn)BMP圖像處理(哈夫曼編碼)

    C語(yǔ)言實(shí)現(xiàn)BMP圖像處理(哈夫曼編碼)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)BMP圖像哈夫曼編碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • C++ AfxBeginThread的介紹/基本用法

    C++ AfxBeginThread的介紹/基本用法

    這篇文章主要簡(jiǎn)單介紹了C++ AfxBeginThread的基本用法,十分的細(xì)致,有需要的小伙伴可以參考下。
    2015-06-06
  • C語(yǔ)言的函數(shù)概念與規(guī)則你了解嗎

    C語(yǔ)言的函數(shù)概念與規(guī)則你了解嗎

    這篇文章主要介紹了C語(yǔ)言中的函數(shù)概念與規(guī)則,本文給大家介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友可以參考下,希望能給你帶來(lái)幫助
    2021-08-08
  • C++中引用和const關(guān)鍵字介紹

    C++中引用和const關(guān)鍵字介紹

    大家好,本篇文章主要講的是C++中引用和const關(guān)鍵字介紹,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-02-02

最新評(píng)論