C++野指針的具體實(shí)現(xiàn)
野指針就是指針指向的不是一個(gè)有效(合法)的地址。
在程序中,如果訪問(wèn)野指針,可能會(huì)造成程序的崩潰。
出現(xiàn)野指針的情況主要有三種:
1)指針在定義的時(shí)候,如果沒(méi)有進(jìn)行初始化,它的值是不確定的(亂指一氣)。
2)如果用指針指向了動(dòng)態(tài)分配的內(nèi)存,內(nèi)存被釋放后,指針不會(huì)置空,但是,指向的地址已失效。
3)指針指向的變量已超越變量的作用域(變量的內(nèi)存空間已被系統(tǒng)回收),讓指針指向了函數(shù)的局部變量,或者把函數(shù)的局部變量的地址作為返回值賦給了指針。
規(guī)避方法:
1)指針在定義的時(shí)候,如果沒(méi)地方指,就初始化為nullptr。
2)動(dòng)態(tài)分配的內(nèi)存被釋放后,將其置為nullptr。
3)函數(shù)不要返回局部變量的地址。
注意:野指針的危害比空指針要大很多,在程序中,如果訪問(wèn)野指針,可能會(huì)造成程序的崩潰。是可能,不是一定,程序的表現(xiàn)是不穩(wěn)定,增加了調(diào)試程序的難度。
實(shí)例1
#include<iostream> using namespace std; #include<string> int main() { int *p = (int *)(0x0000000955523); cout << "*p=" << *p << endl; }
實(shí)例2
#include<iostream> using namespace std; #include<string> int *func() { int a = 3; cout << "a=" << a << " a的地址為" << &a << endl; return &a; } int main() { // 1.直接操作非法地址 //int *p = (int *)(0x0000000955523); //cout << "*p=" << *p << endl; // 2.如果用指針指向了動(dòng)態(tài)分配的內(nèi)存,內(nèi)存被釋放后,指針不會(huì)置空,但是,指向的地址已失效。 //int *p = new int(3); //cout << "p=" << p << "*p=" << *p << endl; //delete p; //cout << "p=" << p << "*p=" << *p << endl; //3.指針指向的變量已超越變量的作用域(變量的內(nèi)存空間已被系統(tǒng)回收), // 讓指針指向了函數(shù)的局部變量,或者把函數(shù)的局部變量的地址作為返回值賦給了指針。 int *pp = func();//函數(shù)的局部變量的地址作為返回值賦給了指針 cout << "pp= " << pp << " *pp= " << *pp << endl; }
到此這篇關(guān)于C++野指針的具體實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C++野指針內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言大小端模式、判斷大小端、大小端轉(zhuǎn)換方法詳解
這篇文章主要介紹了C語(yǔ)言大小端模式、判斷大小端、大小端轉(zhuǎn)換的相關(guān)資料,大端和小端是數(shù)據(jù)在內(nèi)存中的存儲(chǔ)方式,大端模式下高字節(jié)存于低地址,小端模式則相反,大小端問(wèn)題由數(shù)據(jù)類(lèi)型多字節(jié)存儲(chǔ)引起,不同選擇形成不同存儲(chǔ)模式,需要的朋友可以參考下2024-10-10C++哈希應(yīng)用之位圖,哈希切分與布隆過(guò)濾器詳解
這篇文章主要為大家詳細(xì)介紹了C++哈希應(yīng)用中的位圖、哈希切分與布隆過(guò)濾器,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,需要的可以參考一下2023-04-04C語(yǔ)言基于循環(huán)鏈表解決約瑟夫環(huán)問(wèn)題的方法示例
這篇文章主要介紹了C語(yǔ)言基于循環(huán)鏈表解決約瑟夫環(huán)問(wèn)題的方法,簡(jiǎn)單描述了約瑟夫環(huán)問(wèn)題并結(jié)合實(shí)例形式分析了C語(yǔ)言使用循環(huán)鏈表解決約瑟夫環(huán)問(wèn)題的具體操作技巧,需要的朋友可以參考下2018-01-01C++中?‘=default?’及‘?=delete?’的使用
這篇文章主要介紹了C++中?=default?及?=delete?使用,使用=default和=delete可以控制編譯器默認(rèn)函數(shù)體的使用,下面我們就來(lái)看看具體的室友方法吧,需要的朋友也可以參考一下2021-12-12C++實(shí)現(xiàn)字符串類(lèi)型相互轉(zhuǎn)換的代碼示例
在C/C++編程中,字符串是非?;A(chǔ)且常用的數(shù)據(jù)類(lèi)型,但是由于不同的編程語(yǔ)言或標(biāo)準(zhǔn)庫(kù)可能采用不同的字符串類(lèi)型,因此在不同的應(yīng)用場(chǎng)景下可能需要進(jìn)行字符串類(lèi)型的相互轉(zhuǎn)換,本文將介紹如何在C/C++中將char*,std::string,QString,CString/MFC?String相互轉(zhuǎn)換2023-06-06C語(yǔ)言實(shí)現(xiàn)選擇排序、冒泡排序和快速排序的代碼示例
這篇文章主要介紹了C++中實(shí)現(xiàn)選擇排序、冒泡排序和快速排序的代碼示例,例子帶有執(zhí)行時(shí)間統(tǒng)計(jì)還可以簡(jiǎn)單看一下效率對(duì)比,需要的朋友可以參考下2016-04-04VS中的scanf_s函數(shù)和scanf用法及說(shuō)明
這篇文章主要介紹了VS中的scanf_s函數(shù)和scanf用法及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11Java?C++題解?leetcode第k個(gè)數(shù)實(shí)例
這篇文章主要為大家介紹了Java?C++題解?leetcode第k個(gè)數(shù)實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09