最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

1.定義

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

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

2.1使用未初始化的指針

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

#include <iostream>
using namespace std;

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

2.2指針?biāo)傅膶ο笠呀?jīng)消亡

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

#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)行都沒有錯誤,輸出結(jié)果如下:

001AFD48
1701495776

最后一行,輸出的并非想象中的num的值10,因為變量num是存儲在棧空間的局部變量,離開函數(shù)超出其作用域后就會被釋放掉,因此輸出的值就是不確定的值了。

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

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

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

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

2.3指針釋放后之后未置空

指針p被free或者delete之后,沒有置為NULL,讓人誤以為p是個合法的指針。對指針進(jìn)行free和delete,只是把指針?biāo)傅膬?nèi)存空間給釋放掉,但并沒有把指針本身置空,此時指針指向的就是“垃圾”內(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é)果是一個隨機(jī)值,因為此時的指針?biāo)赶虻目臻g是垃圾內(nèi)存,存放著隨機(jī)值。

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

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

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

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

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

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

相關(guān)文章

  • Visual studio setup.exe 安裝vs2022報錯的解決方案

    Visual studio setup.exe 安裝vs2022報錯的解決方案

    這篇文章主要介紹了Visual studio setup.exe 安裝vs2022報錯的解決方案,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2024-01-01
  • 用c語言實現(xiàn)一個電話薄(附完整代碼)

    用c語言實現(xiàn)一個電話薄(附完整代碼)

    大家好,本篇文章主要講的是用c語言實現(xiàn)一個電話薄(附完整代碼),感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • Vs2019+Qt+Opencv環(huán)境配置心得(圖文)

    Vs2019+Qt+Opencv環(huán)境配置心得(圖文)

    這篇文章主要介紹了Vs2019+Qt+Opencv環(huán)境配置心得(圖文),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • C++深入探究引用的使用

    C++深入探究引用的使用

    引用是C++一個很重要的特性,顧名思義是某一個變量或?qū)ο蟮膭e名,對引用的操作與對其所綁定的變量或?qū)ο蟮牟僮魍耆葍r,這篇文章主要給大家總結(jié)介紹了C++中引用的相關(guān)知識點,需要的朋友可以參考下
    2022-05-05
  • 詳解C++中String類模擬實現(xiàn)以及深拷貝淺拷貝

    詳解C++中String類模擬實現(xiàn)以及深拷貝淺拷貝

    這篇文章主要介紹了詳解C++中String類模擬實現(xiàn)以及深拷貝淺拷貝的相關(guān)資料,希望通過本文能幫助到大家,讓大家實現(xiàn)這樣的方法,需要的朋友可以參考下
    2017-10-10
  • C語言字符串快速壓縮算法代碼

    C語言字符串快速壓縮算法代碼

    這篇文章主要介紹了C語言字符串快速壓縮算法代碼,將字符串中連續(xù)出席的重復(fù)字母進(jìn)行壓縮,其主要的壓縮字段的格式為”字符重復(fù)的次數(shù)+字符”。有需要的小伙伴參考下吧。
    2015-03-03
  • QT實現(xiàn)定時關(guān)閉消息提示框

    QT實現(xiàn)定時關(guān)閉消息提示框

    這篇文章主要介紹了軟件利用Qt簡單實現(xiàn)消息提示框可定時自動關(guān)閉,文中的示例代碼講解詳細(xì),對我們;了解QT有一定的幫助,感興趣的可以學(xué)習(xí)一下
    2022-01-01
  • 詳解C++設(shè)計模式編程中建造者模式的實現(xiàn)

    詳解C++設(shè)計模式編程中建造者模式的實現(xiàn)

    這篇文章主要介紹了C++設(shè)計模式編程中建造者模式的實現(xiàn),建造者模式將一個復(fù)雜對象的構(gòu)建于它的表現(xiàn)分離,可以減少代碼冗余,需要的朋友可以參考下
    2016-03-03
  • C++繼承詳細(xì)介紹

    C++繼承詳細(xì)介紹

    我們都知道面向?qū)ο笳Z言的三大特點是:**封裝,繼承,多態(tài)。**之前在類和對象部分,我們提到了C++中的封裝,那么今天呢,我們來學(xué)習(xí)一下C++中的繼承
    2022-10-10
  • Visual Studio Code上添加小程序自動補(bǔ)全插件的操作方法

    Visual Studio Code上添加小程序自動補(bǔ)全插件的操作方法

    這篇文章主要介紹了Visual Studio Code上添加小程序自動補(bǔ)全插件的操作方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04

最新評論

新绛县| 双流县| 万盛区| 中西区| 大埔县| 柘城县| 项城市| 平远县| 抚顺市| 蒙城县| 应城市| 军事| 阿巴嘎旗| 泊头市| 嘉兴市| 滁州市| 二连浩特市| 宁德市| 绩溪县| 肥西县| 晴隆县| 双桥区| 南宁市| 拉萨市| 浑源县| 宜春市| 襄樊市| 白城市| 于田县| 莱阳市| 青海省| 青神县| 班玛县| 樟树市| 新津县| 陕西省| 晋宁县| 乾安县| 广丰县| 双桥区| 玉山县|