C++基礎--指針 野指針和free

野指針的重複釋放問題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

相關文章
相關標籤/搜索