调用delete []后仍可访问C ++指针数组

时间:2016-05-26 14:45:31

标签: c++ arrays pointers free

在以下代码中,调用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;

给出

*** Error in ./ a.out' ;: double free or corruption(top):0x000000000168d010 ***`

1 个答案:

答案 0 :(得分:3)

内存是免费的,这意味着它不再被归因,但是编译器不会花费额外的努力在每次删除某些内容时将其擦除为0.

在访问内存之前,也不会花费精力检查内存是否已正确分配 - 这会降低性能,并且假设您没有这样做。 (虽然像valgrind或调试器这样的工具可以检测到那些错误的调用)

因此它只是在内部将内存范围更改为“未分配”,这意味着对new的另一次调用可以使用相同的内存范围。然后,该内存中的任何数据都将被覆盖,foo[90]将不再返回相同的内容。