C ++单例设计模式
最近我遇到了C ++的Singleton设计模式的实现/实现。 它看起来像这样(我从现实生活的例子中采纳了它):
// a lot of methods are omitted here
class Singleton
{
public:
static Singleton* getInstance( );
~Singleton( );
private:
Singleton( );
static Singleton* instance;
};
从这个声明中,我可以推断实例字段是在堆上启动的。 这意味着有一个内存分配。 对于我来说完全不清楚的是,何时完全释放内存? 还是有一个错误和内存泄漏? 看起来实施中存在问题。
我的主要问题是,我如何以正确的方式实施它?
看到这篇文章的一个简单的设计,以保证破坏单例的延迟评估:
任何人都可以在c ++中为我提供一个Singleton样本吗?
经典的懒惰评估和正确摧毁单身人士。
class S
{
public:
static S& getInstance()
{
static S instance; // Guaranteed to be destroyed.
// Instantiated on first use.
return instance;
}
private:
S() {} // Constructor? (the {} brackets) are needed here.
// C++ 03
// ========
// Don't forget to declare these two. You want to make sure they
// are unacceptable otherwise you may accidentally get copies of
// your singleton appearing.
S(S const&); // Don't Implement
void operator=(S const&); // Don't implement
// C++ 11
// =======
// We can use the better technique of deleting the methods
// we don't want.
public:
S(S const&) = delete;
void operator=(S const&) = delete;
// Note: Scott Meyers mentions in his Effective Modern
// C++ book, that deleted functions should generally
// be public as it results in better error messages
// due to the compilers behavior to check accessibility
// before deleted status
};
看到这篇文章关于何时使用单身人士:(不经常)
辛格尔顿:应该如何使用它
看到这两篇关于初始化顺序和如何应对的文章:
静态变量初始化顺序
查找C ++静态初始化顺序问题
请参阅描述生命时间的文章:
什么是C ++函数中静态变量的生命周期?
请参阅本文讨论对单例的一些线程影响:
Singleton实例声明为GetInstance方法的静态变量
请参阅本文解释为什么双重检查锁定在C ++上不起作用:
C ++程序员应该知道的所有常见的未定义行为是什么?
Dobbs博士:C ++和双重检查锁定的危险:第一部分
作为一个单身人士,你通常不希望它被破坏。
当程序终止时,它将被拆除并释放,这对单身人士而言是正常的,理想的行为。 如果你想能够明确地清除它,向类中添加一个静态方法是相当容易的,它允许你将它恢复到干净状态,并在下次使用它时重新分配,但这超出了范围“经典”单身。
你可以避免内存分配。 有多种变体,在多线程环境下都有问题。
我更喜欢这种实现方式(实际上,我不太喜欢这样说,因为我尽可能避免单身人士):
class Singleton
{
private:
Singleton();
public:
static Singleton& instance()
{
static Singleton INSTANCE;
return INSTANCE;
}
};
它没有动态内存分配。
链接地址: http://www.djcxy.com/p/50079.html上一篇: C++ Singleton design pattern
下一篇: Making a Scrollviewer fill the available space in a DockPanel