调用 delete[] 后仍可访问 C++ 指针数组
C++ pointer array is still accessible after delete[] is called
在下面的代码中,调用了一次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':双重释放或损坏(顶部):0x000000000168d010 ***`
内存是空闲的,这意味着它不再具有属性,但编译器不会在每次删除某些内容时花费额外的努力将其擦回 0。
它也不会在您访问之前检查内存是否已正确分配 - 它会降低性能,并且假设您不这样做。 (虽然像 valgrind 或调试器这样的工具可以检测到那些错误的调用)
所以它只是在内部将内存范围更改为 'unassigned',这意味着对 new
的另一个调用可以使用相同的内存范围。然后该内存中的任何数据都将被覆盖,并且 foo[90]
将不再 return 相同的东西。
在下面的代码中,调用了一次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':双重释放或损坏(顶部):0x000000000168d010 ***`
内存是空闲的,这意味着它不再具有属性,但编译器不会在每次删除某些内容时花费额外的努力将其擦回 0。
它也不会在您访问之前检查内存是否已正确分配 - 它会降低性能,并且假设您不这样做。 (虽然像 valgrind 或调试器这样的工具可以检测到那些错误的调用)
所以它只是在内部将内存范围更改为 'unassigned',这意味着对 new
的另一个调用可以使用相同的内存范围。然后该内存中的任何数据都将被覆盖,并且 foo[90]
将不再 return 相同的东西。