首先看一个问题,下面的代码哪一步会出错?(使用的编译环境是vs2005)
typedef struct Stuent
{
double * a;
Stuent()
{
memset(this, '\0', sizeof(Stuent));
}
};
int main(int argc, _TCHAR* argv[])
{
Stuent stu;
stu.a = new double[255];
stu.a[255] = 3;
if (stu.a!=NULL)
{
delete[] stu.a;
stu.a = NULL;
}
return 0;
}
我们可能会注意到我们之开辟了255的大小,数组通过下标访问只能访问到254.所以编译器到stu.a[255] = 3应该是就会出错,但是编译器似乎没有在这里报错,但是这里很明显访问越界了,出错的地方反而是delete。
首先c++数组读写是不做边界检查的(为了快),这样释放内存的时候就会出问题,此时 delete 一块没有使用权的内存,程序崩溃 。