在下面的代码中,调用了
delete[]
一次以释放由 new
分配的内存。然而,在调用 delete[]
后仍然可以访问数组元素。我调用了两次 delete[]
来确认我是否会得到一个 double free or corruption
错误,结果我果然得到了这个错误,这意味着内存已被释放。如果内存已经被释放,那么我怎么能够访问数组元素呢?这可能是一个安全问题,如果我将类似密码之类的东西读入堆中,就可能被利用。int *foo;
foo = new int[100];
for (int i = 0; i < 100; ++i) {
foo[i] = i+1;
}
cout << foo[90] << endl;
delete[] foo;
cout << foo[90] << endl;
输出结果如下:
91
91
以及
int *foo;
foo = new int[100];
for (int i = 0; i < 100; ++i) {
foo[i] = i+1;
}
cout << foo[90] << endl;
delete[] foo;
delete[] foo;
cout << foo[90] << endl;
提供
*** 在
./a.out'中出错:double free或corruption (top):0x000000000168d010 ***`
delete
后立即将指针设置为nullptr
是一个好习惯(如果存在指针可能被解引用的风险)。这可以减轻意外访问已释放内存(以及双重删除)的风险。 - Sander De Dycker