C++野指針的具體實(shí)現(xiàn)
野指針就是指針指向的不是一個(gè)有效(合法)的地址。
在程序中,如果訪問野指針,可能會(huì)造成程序的崩潰。
出現(xiàn)野指針的情況主要有三種:
1)指針在定義的時(shí)候,如果沒有進(jìn)行初始化,它的值是不確定的(亂指一氣)。
2)如果用指針指向了動(dòng)態(tài)分配的內(nèi)存,內(nèi)存被釋放后,指針不會(huì)置空,但是,指向的地址已失效。
3)指針指向的變量已超越變量的作用域(變量的內(nèi)存空間已被系統(tǒng)回收),讓指針指向了函數(shù)的局部變量,或者把函數(shù)的局部變量的地址作為返回值賦給了指針。
規(guī)避方法:
1)指針在定義的時(shí)候,如果沒地方指,就初始化為nullptr。
2)動(dòng)態(tài)分配的內(nèi)存被釋放后,將其置為nullptr。
3)函數(shù)不要返回局部變量的地址。
注意:野指針的危害比空指針要大很多,在程序中,如果訪問野指針,可能會(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++設(shè)計(jì)模式之享元模式(Flyweight)
這篇文章主要為大家詳細(xì)介紹了C++設(shè)計(jì)模式之享元模式Flyweight,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04
C++中關(guān)于[]靜態(tài)數(shù)組和new分配的動(dòng)態(tài)數(shù)組的區(qū)別分析
這篇文章主要介紹了C++中關(guān)于[]靜態(tài)數(shù)組和new分配的動(dòng)態(tài)數(shù)組的區(qū)別分析,很重要的概念,需要的朋友可以參考下2014-08-08
C語言實(shí)現(xiàn)簡(jiǎn)單停車場(chǎng)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)簡(jiǎn)單停車場(chǎng)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12
C++實(shí)現(xiàn)惡搞電腦關(guān)機(jī)小程序的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用C++實(shí)現(xiàn)一個(gè)簡(jiǎn)單的惡搞電腦關(guān)機(jī)小程序,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以嘗試一下2022-11-11

