sco*_*ott 3 c++ arrays free pointers
在以下代码中,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;
Run Code Online (Sandbox Code Playgroud)
给出以下输出
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;
Run Code Online (Sandbox Code Playgroud)
给出
*** Error in./a.out':双重释放或损坏(顶部):0x000000000168d010 ***`
内存是空闲的,这意味着它不再被归属,但编译器不会在每次删除某些内容时花费额外的努力将其擦除回 0。
在访问内存之前,它也不会花精力检查内存是否已正确分配 - 这会降低性能,并且它假设您不这样做。(尽管像 valgrind 或调试器这样的工具可以检测到那些错误的调用)
因此,它只是在内部将内存范围更改为“未分配”,这意味着另一个调用new可以使用相同的内存范围。然后该内存中的任何数据都将被覆盖,并且foo[90]不会再返回相同的内容。
| 归档时间: |
|
| 查看次数: |
2553 次 |
| 最近记录: |