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

标签 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;

给予

*** 错误 ./a.out':双重释放或损坏(顶部):0x000000000168d010 ***`

最佳答案

内存是空闲的,这意味着它不再具有属性,但编译器不会在每次删除某些内容时花费额外的努力将其擦回 0。

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

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

关于调用 delete[] 后仍可访问 C++ 指针数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37464159/

相关文章:

C++:在不同派生类对象的基指针上调用(派生的)成员函数

c# - 另一个二维数组分配问题c#

c - 带 void 的动态数组内存分配**

c++ - 指向函数或仿函数的指针?函数发生器

c++ - 如何从分离的 QProcess 中读取标准输出/标准错误

javascript - 比较对象属性键与数组中的对象属性值,返回 "Total Points"

arrays - 什么时候返回数组或散列,什么时候只返回引用?

c++ - 哪种转换是从 Type* 到 void*?

c++ - 设计问题 : Enum or functions or something else

c++ - 在 C 中重写我用 C++ 编写的这个通用函数的最佳方法是什么?