野指針的重複釋放問題ios
最近發現了這樣一個問題,一個指針釋放兩次以後,若在中間不置空,會報Invalid address specified to RtlValidateHeap 無效的堆地址 錯誤。c++
#include <iostream> #include <string> #include <malloc.h> using namespace std; int main() { int* p = (int*)malloc(100); free(p); free(p); }
想搞清楚爲何發生這種錯誤,首先得先搞清楚free()作了什麼:函數
#include <iostream> using namespace std; int main() { int *p = (int*)malloc(100); printf("釋放前p的地址%p\n",p); free(p); printf("釋放後p的地址%p\n",p); /**結果爲: 釋放前p的地址00000000006ffe14 釋放後p的地址00000000006ffe14 **/ }
從代碼中能夠看到,free()先後p的值其實是沒有變化的,也就是說,p並無置爲空。spa
若此時加入該語句:操作系統
char x = *p;
則會觸發程序斷點Invalid address specified to RtlValidateHeap 無效的堆地址指針
然而明明p是有指向的,爲何會是無效的堆地址呢?code
緣由就是free()函數只是告訴了操做系統,這塊內存我再也不使用了,操做系統能夠將該塊內存從新分配了。內存
回到原有問題,當p被free()過一次以後,它實際上就成爲了一個野指針,指向一個操做系統所保護的區域,這個區域將在將來可能被其餘的指針指向。所以,咱們第二次free(p)的時候,它實際上就是在操做一個可能已經其餘模塊用到的空間了,這時,也就出發了Invalid address specified to RtlValidateHeap 。ci