最近我碰到了C++的Singleton设计模式的实现/实现.看起来像这样(我从现实生活中采用了它):
// a lot of methods are omitted here
class Singleton
{
public:
static Singleton* getInstance( );
~Singleton( );
private:
Singleton( );
static Singleton* instance;
};
Run Code Online (Sandbox Code Playgroud)
从这个声明我可以推断出实例字段是在堆上启动的.这意味着存在内存分配.对我来说完全不清楚的是,什么时候内存将被解除分配?还是有漏洞和内存泄漏?好像在实施中存在问题.
我的主要问题是,如何以正确的方式实施它?
单身人士是一个备受争议的设计模式,所以我对Stack Overflow社区对它们的看法感兴趣.
请提供您的意见的原因,而不仅仅是"单身人士是懒惰的程序员!"
这是一篇关于这个问题的相当不错的文章,虽然它反对使用Singletons: scientificninja.com:performant-singletons.
有没有人对他们有任何其他好文章?也许是为了支持单身人士?
我已经被认为如果多个线程可以访问变量,那么所有对该变量的读取和写入都必须受到同步代码的保护,例如"lock"语句,因为处理器可能会在中途切换到另一个线程写.
但是,我正在使用Reflector查看System.Web.Security.Membership并找到如下代码:
public static class Membership
{
private static bool s_Initialized = false;
private static object s_lock = new object();
private static MembershipProvider s_Provider;
public static MembershipProvider Provider
{
get
{
Initialize();
return s_Provider;
}
}
private static void Initialize()
{
if (s_Initialized)
return;
lock(s_lock)
{
if (s_Initialized)
return;
// Perform initialization...
s_Initialized = true;
}
}
}
Run Code Online (Sandbox Code Playgroud)
为什么s_Initialized字段在锁外读取?另一个线程难道不能同时写入它吗?变量的读写是否是原子的?
我对c ++中的私有构造函数有疑问,如果构造函数是私有的,如何创建类的实例?我们应该在类中有一个getInstance()方法吗?
我按照以下方式编写单例c ++:
class A {
private:
static A* m_pA;
A();
virtual ~A();
public:
static A* GetInstance();
static void FreeInstance();
void WORK1();
void WORK2();
void WORK3();
}
}
A* A::GetInstance() {
if (m_pA == NULL)
m_pA = new A();
return m_pA;
}
A::~A() {
FreeInstance() // Can I write this? are there any potential error?
}
void A::FreeInstance() {
delete m_pA;
m_pA = NULL;
}
Run Code Online (Sandbox Code Playgroud)
谢谢!Evan Teran和sep61.myopenid.com的回答是正确的,非常好!我的方式是错的,我希望任何人写这样的代码都可以避免我的愚蠢错误.
我的项目中的单例A有一个智能指针向量,另一个线程也可以编辑这个向量,所以当应用程序关闭时,即使我添加了很多CMutex,它总是变得不稳定.多线程错误+单身错误浪费了我一天.
// ------------------------------------------------ -----------新单例,如果您认为以下示例中存在任何问题,欢迎您进行编辑:
class A {
private:
static A* m_pA;
explicit A();
void …Run Code Online (Sandbox Code Playgroud) 我已经尝试过几次了解Singleton是什么.也许我只是太过视觉化......所以任何人都可以用一个简单的比喻来分解它.
类似帖子:
最近我遇到了关于实现Singleton但是涉及抽象基类的问题.假设我们有这样的类层次结构:
class IFoo {...}; // it's ABC
class Foo : public IFoo {...};
Run Code Online (Sandbox Code Playgroud)
我们有单例类定义如下:
template <typename T>
class Singleton
{
public:
static T* Instance() {
if (m_instance == NULL) {
m_instance = new T();
}
return m_instance;
}
private:
static T* m_instance;
};
Run Code Online (Sandbox Code Playgroud)
所以,如果我想使用如下:IFoo::Instance()->foo();我该怎么办?
如果我这样做:class IFoo : public Singleton<IFoo> {...};它将无法工作,因为Singleton将调用IFoo的ctor,但IFoo是一个ABC,因此无法创建.
而且:这个class Foo : public IFoo, public Singleton<Foo> {...};也行不通,因为这种类IFoo没有方法Instance()的接口,所以调用IFoo::Instance()会失败.
有任何想法吗?
您可以找到在Static类上使用Singleton的众多原因.但肯定会有一些情况,在Singleton之前使用静态类会更好.这些是什么?
我读了Jim Hyslop和Herb Sutter 的文章抽象工厂,模板风格.该工厂实现为Singleton.它们提供了一种使用RegisterInFactory助手类自动注册类的简便方法.
现在我已经多次阅读过Singletons应该避免的内容,有些人甚至将它们视为反模式,并且只有少数情况下它们是有用的.这是其中之一吗?或者是否有另一种方法可以提供自动批准类的简单方法?