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

相关文章
相关标签/搜索