销毁的c++对象的数据仍然可以访问
Data of destroyed C++ object still accessible?
在下面的代码中,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"的一个子集
销毁仅仅意味着内存被交还给它原来的所有者(操作系统)。它不会被擦除或覆盖。一些操作系统允许你读取任何内存,所以你可以读取它,如果你幸运的话,没有其他人获得这片内存,你的价值仍然在那里。请注意,幸运并不能以任何方式保证,您的程序也可能崩溃和燃烧。
为什么要销毁数据?恐怕你对正在发生的事情的思维模式显然是错误的。当一个对象从堆栈或堆中释放出来时,所发生的只是存储它的内存现在被标记为可供使用的空闲内存。
相关文章:
- 在类 A 中创建类型为 B 类的向量 - 访问数据 [C++] [成员在两个类中都是私有的]
- C++ 11 中的锁定是否保证访问数据的新鲜度?
- 访问数据成员(本身是对象)的数据成员,就好像它们是类成员一样
- 读取大文件(>2GB)(文本文件包含以太网数据)并通过不同参数随机访问数据的最佳方法是什么?
- 向量下标出的范围错误.即使向量的索引大于访问数据的索引,也会发生误差
- 通过指针访问数据(重新解释转换)与 .或 ->运算符
- C Koala图库 - 了解访问数据结构的语法
- CAFFE C - 其他层中的访问数据
- C++ 访问数据的链表实现
- 基于两个程序之间的事件触发器访问数据(内存)
- 引用本地可访问数据的正当理由
- 函数调用不起作用,矢量访问数据
- BMP 文件,访问数据
- 如何从其他类访问数据私有内部类
- 如何从双精度向量的向量访问数据
- 从 Vector3f 访问数据
- 从文件访问数据
- 如何在进程已经在访问数据结构时修改数据结构
- 如何从 GMemoryOutputStream 访问数据
- 使用 ostream 从另一个类的结构访问数据