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