如果我从GetInstance()中返回对我的MySingleton实例的引用而不是下面代码中的指针,那么它将是有效的,但是这样使用指针也有效吗?
我认为我的指针只会被初始化一次,因为它是静态的,但不是很确定。
我知道在单例中使用原始指针的正确方法是在分配之前检查指针是否为第一个null,但是想知道下面的代码是否也有效。谢谢
class MySingleton
{
public:
static MySingleton* GetInstance()
{
static MySingleton* inst = new MySingleton();
return inst;
}
private:
MySingleton(){};
};
编辑:我还没有看到在报告的重复问题中实现的Singleton的确切实现
答案 0 :(得分:0)
请参阅std::call_once
和std::once_flag
以实现单例模式。您的实现将导致多线程环境中的麻烦。
大多数人似乎错过了最简单的C ++单身人士AKA Scott Meyer's Singleton。自从C ++ 11以来,它变得像馅饼一样简单:
class singleton{
singleton();
singleton(singleton&&)=delete;
singleton(singleton const&)=delete;
void operator(singleton&&)=delete;
void operator(singleton const&)=delete;
//...
public:
static auto& singleton::instance(){
static singleton val{};
return val;
}
};
无需复杂的代码。
答案 1 :(得分:0)
只要满足下列任何一项要求,您的实施就可以接受(就像其他任何一样):
您的单例不会获取任何外部资源(任何内容:文件句柄,网络连接,共享内存)的时间超过单个异常安全方法调用。
您的单身delete
的最后一位用户是手动实例。
否则严重的事情可能会泄漏。
您可以将实例自动包装在某些内容中,例如std::unique_ptr
,但这会立即导致通常的单例生存期问题。