一个很简单但是可能忽视的问题,请看下面的C/C++代码
#include<iostream>
using namespace std;
void main()
{
int x=1;
int *p=&x;
free(p);
}
using namespace std;
void main()
{
int x=1;
int *p=&x;
free(p);
}
问这段程序可以正常运行吗?
答案是throw如下的exception
跟踪到汇编代码,可以看到throw exception之前的一段大致如下的指令:
00408C5C call _CrtIsValidHeapPointer (004096c0)
这条函数的大致作用是检查对应的memaddress是否为有效的heap区域。若否,则产生一个中断,然后调用该指令的free抛出一个exception。