相关疑难解决方法(0)

C++ Singleton设计模式

最近我碰到了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)

从这个声明我可以推断出实例字段是在堆上启动的.这意味着存在内存分配.对我来说完全不清楚的是,什么时候内存将被解除分配?还是有漏洞和内存泄漏?好像在实施中存在问题.

我的主要问题是,如何以正确的方式实施它?

c++ singleton design-patterns

692
推荐指数
11
解决办法
65万
查看次数

单身人士:好的设计还是拐杖?

单身人士是一个备受争议的设计模式,所以我对Stack Overflow社区对它们的看法感兴趣.

请提供您的意见的原因,而不仅仅是"单身人士是懒惰的程序员!"

这是一篇关于这个问题的相当不错的文章,虽然它反对使用Singletons: scientificninja.com:performant-singletons.

有没有人对他们有任何其他好文章?也许是为了支持单身人士?

language-agnostic singleton design-patterns

67
推荐指数
11
解决办法
2万
查看次数

在C#中访问变量是一个原子操作吗?

我已经被认为如果多个线程可以访问变量,那么所有对该变量的读取和写入都必须受到同步代码的保护,例如"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# multithreading

63
推荐指数
4
解决办法
2万
查看次数

我们何时需要C++中的私有构造函数

我对c ++中的私有构造函数有疑问,如果构造函数是私有的,如何创建类的实例?我们应该在类中有一个getInstance()方法吗?

c++ constructor private

39
推荐指数
3
解决办法
4万
查看次数

任何人都可以在c ++中为我提供Singleton样本吗?

我按照以下方式编写单例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)

c++ singleton design-patterns

38
推荐指数
2
解决办法
9万
查看次数


您选择BOOST中的哪个Singleton库?

谷歌的结果表明,在推特中有超过1个单身模板/基类,你建议哪一个?

c++ singleton boost

12
推荐指数
1
解决办法
2万
查看次数

C++中的Singleton和Abstract基类

最近我遇到了关于实现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()会失败.

有任何想法吗?

c++ singleton

11
推荐指数
2
解决办法
2万
查看次数

静态类优于使用Singleton的优点

重复

单身人士怎么了?
单身人士:好的设计还是拐杖?
Singleton:应该如何使用单身人士有
什么不好的


您可以找到在Static类上使用Singleton的众多原因.但肯定会有一些情况,在Singleton之前使用静态类会更好.这些是什么?

singleton static class

8
推荐指数
3
解决办法
6580
查看次数

GenericFactory as Singleton

我读了Jim Hyslop和Herb Sutter 的文章抽象工厂,模板风格.该工厂实现为Singleton.它们提供了一种使用RegisterInFactory助手类自动注册类的简便方法.

现在我已经多次阅读过Singletons应该避免的内容,有些人甚至将它们视为反模式,并且只有少数情况下它们是有用的.这是其中之一吗?或者是否有另一种方法可以提供自动批准类的简单方法?

c++ generics singleton factory

8
推荐指数
1
解决办法
1086
查看次数