将shared_ptr与singleton一起使用有什么好处

时间:2017-06-30 16:51:10

标签: c++ singleton shared-ptr

这里有两个单身,是什么使第一个更好,因为它们只会实例化相应类的一个实例:

首先:

class SharedPointerSingleton  {
public:
      static std::shared_ptr< SharedPointerSingleton> getSingleton(
   {
      if( s_pSingleton== 0 ) s_pSingleton = std::shared_ptr< SharedPointerSingleton>(new SharedPointerSingleton());
      return s_pSingleton;
   }


private:
   SharedPointerSingleton(){};
   static std::shared_ptr< SharedPointerSingleton> s_pSingleton;
};

第二

class PointerSingleton  {
public:
      static  PointerSingleton * getSingleton(
   {
      if( pSingleton== 0 )  pSingleton =  new PointerSingleton ());
      return  pSingleton;
   }


private:
   PointerSingleton (){};
   static  PointerSingleton *  pSingleton;
};

2 个答案:

答案 0 :(得分:2)

两种实施都有其优点和缺点。第一种解决方案具有使用std::shared_ptr的开销,这在某些情况下可能会引人注意。第二种解决方案不会在程序结束时销毁单个对象。尽管在程序生命周期结束时OS会释放内存,但通常不能正确销毁C ++对象。它可以直接或间接地释放未被OS清理的资源,例如临时文件,共享内存等,并且在析构函数中释放资源是一种常见的做法。

答案 1 :(得分:1)

当程序结束时第二次泄漏(虽然OS 应该清理内存,但是你缺少的析构函数调用可能是个问题)。这可能就是为什么有人在顶部添加智能指针的原因。

但是,两个版本都已损坏,容易受到初始化顺序问题的影响。

相反,&#34;适当的&#34;产生单身的方法是这样的:

main

这种方法是安全的,没有智能指针或动态分配的开销。现在,当你第一次提出它时,对象就是精确构建的,这是非常优越的(除非你希望它在map.addControl(new mapboxgl.GeolocateControl());之前发生...但是你仍然可以在命名空间范围内实例化它,如果你比如通过调用这个函数!)。