【C++】野指针及其危害
生活随笔
收集整理的這篇文章主要介紹了
【C++】野指针及其危害
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
【C++】 野指針及其危害
引言:小白在初期敲代碼時(shí)最可能碰到的問(wèn)題之一估計(jì)就是野指針了,因?yàn)樗趯?xiě)程序的時(shí)候一不注意就寫(xiě)出來(lái)了,且不容易被發(fā)現(xiàn),調(diào)試半天可能也不會(huì)出結(jié)果。去找大佬一看,其實(shí)就是一個(gè)很簡(jiǎn)單的野指針問(wèn)題,那么我們今天就來(lái)學(xué)習(xí)一下關(guān)于野指針的問(wèn)題,以及怎么在敲代碼時(shí)如何規(guī)避它。
什么是野指針呢?
答:“野指針”并不是NULL指針,而是在定義上沒(méi)有初始化,值為隨機(jī),又或者是指向了已經(jīng)被釋放內(nèi)存了的指針或是指向越界的變量作用域的指針。
野指針的成因:
- ①指針變量沒(méi)有被初始化。首先我們要知道,任何指針變量剛被創(chuàng)建時(shí)不會(huì)自動(dòng)成為NULL指針,它的默認(rèn)值是隨機(jī)的,可能會(huì)指向任意位置。所以,指針變量在創(chuàng)建時(shí)的最開(kāi)始就應(yīng)該及時(shí)對(duì)其初始化,要么將其置為NULL,要么讓它指向一塊合法的內(nèi)存。
- ②指針ptr被free或者delete之后,只是釋放了ptr所指向的內(nèi)存,而沒(méi)有把指針ptr干掉,且沒(méi)有及時(shí)被置為NULL,當(dāng)后邊用到它時(shí),以為它任然是合法的。
- ③指針操作超越了變量所在的作用域,意思是返回了指向棧內(nèi)存的指針或引用,因?yàn)闂?nèi)存在函數(shù)結(jié)束時(shí)就會(huì)被釋放掉。
野指針的危害:
下面我們通過(guò)一段代碼來(lái)分析一下:
解析:
- ①代碼第1行,沒(méi)有問(wèn)題,聲明了一個(gè)short*型的指針,并且沒(méi)有初始化,為后邊買(mǎi)下炸彈。
②代碼第2行,沒(méi)有問(wèn)題,聲明了一個(gè)20個(gè)元素的數(shù)組,每個(gè)元素都是short型的。
③代碼第3行,沒(méi)有問(wèn)題,聲明了short類(lèi)型的變量var,并且初始化為0X20。
④代碼第4行,有錯(cuò)誤,此處將bufptr指針指向的內(nèi)容賦值為var變量的值,因?yàn)閎ufptr在最開(kāi)始并沒(méi)有被初始化,是一個(gè)“野指針”,因此對(duì)他指向的內(nèi)容操作是非常危險(xiǎn)的,會(huì)導(dǎo)致程序崩潰。為了杜絕這種錯(cuò)誤操作,我們可以將bufptr進(jìn)行正確初始化,應(yīng)該將第一行改為short *bufptr=(short*)malloc(sizeof(short)); ⑤代碼第5行,沒(méi)有問(wèn)題。把bufarray的第一個(gè)元素賦值為變量var的值。
野指針危害總結(jié):
- 1.指向不可訪問(wèn)的一段地址,觸發(fā)段錯(cuò)誤。
- 2.指向一個(gè)可用的,但是正在被使用的空間,如果在此時(shí)對(duì)這段空間解引用后,對(duì)其加以修改或者釋放,但是這段空間正在被使用,這是非常危險(xiǎn)的操作,程序會(huì)崩潰,數(shù)據(jù)也會(huì)可能被破壞。
C/C++語(yǔ)言中使用指針的規(guī)則,避免野指針
- 1、用malloc申請(qǐng)了內(nèi)存之后,應(yīng)該立即檢查指針值是否為NULL,防止使用值為NULL的指針。
- 2、動(dòng)態(tài)申請(qǐng)操作必須和釋放操作匹配,防止內(nèi)存泄露和多次釋放。誰(shuí)申請(qǐng),誰(shuí)釋放。
- 3、牢記數(shù)組的長(zhǎng)度,防止數(shù)組越界操作,考慮使用柔性數(shù)組,使用結(jié)構(gòu)體struct來(lái)定義柔性數(shù)組。
- 4、free指針之后必須立即賦值為NULL。
總結(jié)
以上是生活随笔為你收集整理的【C++】野指针及其危害的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: arista eos系统从零开始研究(1
- 下一篇: B/S中的三层架构和MVC设计模型