C++中static的含义

ple*_* me 4 c++ static memory-management

我以为我对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.这是.

那么,这里发生了什么?为什么新的返回完全相同的内存块,以前的删除据说是免费的?这只是因为操作系统的内存管理器决定做什么,或者我缺少什么特别的静态?

谢谢!

Mar*_*n B 9

这就是内存管理员决定做的事情.如果你考虑一下,它就会很有意义:你刚刚释放了一个int,然后你再次要求一个int ...为什么内存管理器不能给你回来你刚刚释放的int?

从技术上讲,当你delete的内存管理器附加你释放到空闲列表开头的内存块时,可能会发生什么.然后,当您调用时new,内存管理器会扫描其空闲列表,并在第一个条目处找到适当大小的块.

有关动态内存分配的详细信息,请参阅"内部存储分配".