这里有两个单身,是什么使第一个更好,因为它们只会实例化相应类的一个实例:
首先:
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;
};
答案 0 :(得分:2)
两种实施都有其优点和缺点。第一种解决方案具有使用std::shared_ptr
的开销,这在某些情况下可能会引人注意。第二种解决方案不会在程序结束时销毁单个对象。尽管在程序生命周期结束时OS会释放内存,但通常不能正确销毁C ++对象。它可以直接或间接地释放未被OS清理的资源,例如临时文件,共享内存等,并且在析构函数中释放资源是一种常见的做法。
答案 1 :(得分:1)
当程序结束时第二次泄漏(虽然OS 应该清理内存,但是你缺少的析构函数调用可能是个问题)。这可能就是为什么有人在顶部添加智能指针的原因。
但是,两个版本都已损坏,容易受到初始化顺序问题的影响。
相反,&#34;适当的&#34;产生单身的方法是这样的:main
这种方法是安全的,没有智能指针或动态分配的开销。现在,当你第一次提出它时,对象就是精确构建的,这是非常优越的(除非你希望它在map.addControl(new mapboxgl.GeolocateControl());
之前发生...但是你仍然可以在命名空间范围内实例化它,如果你比如通过调用这个函数!)。