销毁的c++对象的数据仍然可以访问

Data of destroyed C++ object still accessible?

本文关键字:访问 数据 c++ 对象      更新时间:2023-10-16

在下面的代码中,getObj()函数返回一个对本地对象的引用。这显然是非常糟糕的,因为当函数返回时对象将被销毁(tor和dtor输出强调对象的生命周期)。如预期的那样,编译器(gcc44)给出了相应的警告。

#include <iostream>
class Blah {
private:
    int a_;
public:
    Blah(int a) : a_(a) { std::cout << "Constructing...n"; }
    ~Blah() { std::cout << "...Destructingn"; }
    void print() { std::cout << a_ << "n"; }
};
Blah& getObj() 
{
    Blah blah(3);
    return blah; // returning reference to local object
}
int main()
{
    Blah& b = getObj();
    b.print(); // why does this still output the correct value???
    return 0;
}

然而,在明显被破坏的对象上调用print()仍然打印出私有变量a_的正确值。这是输出:


建设…………销毁
3

这是怎么回事?我希望所有的对象数据也被销毁。

称为未定义行为。任何事情都有可能发生。你所看到的只是"anything"的一个子集

销毁仅仅意味着内存被交还给它原来的所有者(操作系统)。它不会被擦除或覆盖。一些操作系统允许你读取任何内存,所以你可以读取它,如果你幸运的话,没有其他人获得这片内存,你的价值仍然在那里。请注意,幸运并不能以任何方式保证,您的程序也可能崩溃和燃烧。

为什么要销毁数据?恐怕你对正在发生的事情的思维模式显然是错误的。当一个对象从堆栈或堆中释放出来时,所发生的只是存储它的内存现在被标记为可供使用的空闲内存。