C++ 11中的静态局部变量?

iBr*_*aAa 4 c++ singleton static c++11

有什么区别:

class A {
 public:
   static const A& GetInstance() {
     static A a;
     return a;
   }
};
Run Code Online (Sandbox Code Playgroud)

class B {
  public:
   static const B* GetInstance() {
     static B* b = new B;
     return b;
   }
};
Run Code Online (Sandbox Code Playgroud)

?A和B之间的Singleton的寿命是否存在差异?对象的内存位置?一般的差异?

pad*_*ddy 8

在这两种情况下,对象的生命周期是不同的.C++保证静态本地对象将以与构造相反的顺序销毁.在这两种情况下,构造都会在GetInstance首次调用时发生.

但是,在第二种情况下,为变量b分配了一个分配的指针new.当b从静态存储删除,该内存将保持到堆终于拆掉了.在那个阶段,它将被视为"泄露",并且B永远不会调用析构函数(如果有的话).

最好像这样实现基于指针的方法:

class B {
  public:
   static const B* GetInstance() {
     static std::unique_ptr<B> b( new B );
     return b.get();
   }
};
Run Code Online (Sandbox Code Playgroud)

现在,B::~B()将调用(如果适用)并且在b销毁时将正确删除内存,并且生命周期与第一个示例相同.

这只是留下你关于内存位置的问题.位置会有所不同.静态变量通常存储在程序的数据段中,而分配的任何内容new都将存储在堆中.