野指针的重复释放问题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