我目前正在阅读C++ prime plus,以学习动态内存分配。我在书上尝试了一段代码,但是在添加一行之后,我对所得到的内容感到困惑:在我释放了p3的内存之后,我要求计算机打印p3 [2],而计算机实际上已经打印了出来p3的正确值。但是,在释放内存后,是否应该无法打印?
这是代码:
// arraynew.cpp -- using the new operator for arrays
#include <iostream>
int main() {
using namespace std;
double * p3 = new double [3]; // space for 3 doubles
p3[0] = 0.2; // treat p3 like an array name
p3[1] = 0.5;
p3[2] = 0.8;
cout << "p3[1] is " << p3[1] << ".\n";
p3 = p3 + 1; // increment the pointer
cout << "Now p3[0] is " << p3[0] << " and ";
cout << "p3[1] is " << p3[1] << ".\n";
cout << "p3[2] is " << p3[2] << ".\n";
p3 = p3 - 1; // point back to beginning
delete [] p3; // free the memory
cout << "p3[2] is " << p3[2] << ".\n";
return 0;
}
Here is the result:
p3[1] is 0.5.
Now p3[0] is 0.5 and p3[1] is 0.8.
p3[2] is 6.95326e-310.
p3[2] is 0.8.
最佳答案
释放内存后,内容将失效。这并不意味着必须删除它们-这将浪费操作系统资源。解除分配通常意味着,每当其他进程请求HEAP内存时,操作系统就可以自由使用该内存-如果同时尝试访问该内存,则很有可能像在此一样在其中找到原始内容。
也就是说,尝试访问已释放的内存是未定义的行为。根本无法保证您可以在那里找到原始内容,也不能立即将其删除。可能发生任何事情,所以不要这样做!
关于c++ - 对C++ Prime的困惑加上动态数组的示例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36148362/