静态在C ++中的含义

我认为我对C ++相当好,事实证明我不是。 我问的前一个问题:C ++ const左值引用在其中一个答案中有以下代码:


#include <iostream>
using namespace std;

int& GenX(bool reset) { static int* x = new int; *x = 100; if (reset) { delete x; x = new int; *x = 200; } return *x; }

class YStore { public: YStore(int& x); int& getX() { return my_x; } private: int& my_x; };

YStore::YStore(int& x) : my_x(x) { }

int main() { YStore Y(GenX(false)); cout << "X: " << Y.getX() << endl; GenX(true); // side-effect in Y cout << "X: " << Y.getX() << endl; return 0; }

上面的代码输出X:100,X:200。 我不懂为什么。 我玩了一下,并添加了一些更多的输出,即删除x之前的cout; 和新的x之后的cout; 在复位控制块内。

我得到的是:在删除之前:0x92ee018之后:0x92ee018

所以,我认为静态是在没有更新到x的情况下失败,第二个getX正在(在删除之后)未初始化的内存中播放; 为了测试这个,我添加了ax = 0; 在删除之后,新的和另一个cout之前,确保x确实被重置为0.它是。

那么,这里发生了什么? 为什么新的返回与以前删除被释放的完全相同的内存块? 这仅仅是因为这是操作系统的内存管理器决定做什么,或者是有什么特别的静态,我失踪了?

谢谢!


这正是内存经理决定要做的。 如果你仔细想一想,那就很有意义了:你刚刚释放了一个int,然后再次请求一个int ......为什么内存管理器不应该让你恢复刚释放的int?

从技术上讲,当你delete时可能发生的事情是内存管理器将你释放的内存块附加到空闲列表的开头。 然后,当你调用new ,内存管理器会扫描其空闲列表,并在第一个入口处找到适当大小的块。

有关动态内存分配的更多信息,请参阅“内部存储分配”。


对于你的第一个问题:

X:100,X:200。 我不懂为什么。

由于Y.my_x只是给一个参考static *xGenX ,这是它究竟应该如何它是-两者都引用相同的地址在内存中,当你改变* x的内容,你会得到一个侧面影响。


您正在访问已解除分配的内存块。 按照c ++标准,这是一个未定义的行为,因此任何事情都可能发生。

编辑

我想我必须画出:

  • 您为int分配内存,并将堆中分配的对象传递给Y的构造函数,该构造函数将该对象存储在引用中
  • 那么你将释放该内存,但是你的对象Y仍然持有对释放对象的引用
  • 那么你再次访问Y对象,它包含一个无效的引用,引用释放的对象,并且你得到的结果是未定义行为的结果。
  • EDIT2

    答案为什么:实现定义。 编译器可以在任何喜欢的位置创建新的对象。

    链接地址: http://www.djcxy.com/p/85063.html

    上一篇: The meaning of static in C++

    下一篇: defining < operator for map of list iterators