物聯(lián)網(wǎng)/嵌入式工程師
重磅升級(jí):新增硬件電路設(shè)計(jì)與實(shí)戰(zhàn),讓你軟硬通吃,同級(jí)PK無(wú)敵!行業(yè)風(fēng)口、政策傾斜,新晉熱門高薪不內(nèi)卷!0基礎(chǔ)一站式就業(yè)完整路徑,搶占先發(fā)優(yōu)勢(shì)!
在 C++ 中,如果你申明一個(gè)變量,而不對(duì)其進(jìn)行初始化,如同下面:
int a;
這時(shí)候 a 的值可能是一個(gè)任意值,那么對(duì)于一個(gè)指針來(lái)說(shuō):
int * p;
不對(duì)其進(jìn)行初始化,那么這個(gè)指針也和普通變量一樣,他的值也是一個(gè)任意值,既然是任意值,那么其實(shí)是無(wú)法確認(rèn)這個(gè)指針指向哪里的。
無(wú)法確認(rèn)指向的指針,或者指向一個(gè)無(wú)效地址的指針,我們把他叫做野指針。野指針是十分危險(xiǎn)的,試想,你壓根不知道這個(gè)指針指向哪里,然后又貿(mào)然去操作指針指向的地址,必然會(huì)出問題。
現(xiàn)實(shí)中,有這樣一種情況很容易引發(fā)野指針的問題。請(qǐng)看下面的代碼:
#include <stdio.h> #include <stdlib.h> int main(int argc,char **argv) { int * p = (int *)malloc(2 * sizeof(int)); free(p); free(p); return 0; }
這段代碼中,我們將一個(gè)指針重復(fù) free 了兩次,在第一次 free 之后,相應(yīng)的內(nèi)存被釋放了,但是指針還是指向原來(lái)的位置,重復(fù)釋放,就會(huì)出問題,運(yùn)行結(jié)果如下
運(yùn)行失敗 /bin/bash: line 1: 29091 Segmentation fault (core dumped) index
那么比較好的做法是什么呢?我們來(lái)介紹一個(gè)新的概念。
指針可以指向一個(gè)地方,那么指針可不可以表示不指向任何一個(gè)地方呢?答案是可以的。
在 C++ 中有一個(gè)空指針的概念,當(dāng)你把一個(gè)指針賦值成空指針的時(shí)候,就意味著這個(gè)指針不指向任何地方。
int * p = nullptr;
而對(duì)一個(gè)已經(jīng)賦值成了 nullptr 的指針再進(jìn)行 free 操作,就不會(huì)有問題了。
所以在 C++ 中,釋放一個(gè)指針指向的內(nèi)存的時(shí)候,應(yīng)該這樣做。
#include <stdio.h> #include <stdlib.h> int main(int argc,char **argv) { int * p = (int *)malloc(2 * sizeof(int)); if(p != nullptr){ free(p); p = nullptr; } free(p); return 0; }
在釋放之后,手動(dòng)將指針賦值成 nullptr,這樣即使再次調(diào)用 free,也不會(huì)有問題了。
請(qǐng)驗(yàn)證,完成請(qǐng)求
由于請(qǐng)求次數(shù)過多,請(qǐng)先驗(yàn)證,完成再次請(qǐng)求
打開微信掃碼自動(dòng)綁定
綁定后可得到
使用 Ctrl+D 可將課程添加到書簽
舉報(bào)