我目前正在阅读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/

10-11 09:27