当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《任何人都可以在c++中为我提供Singleton样本吗?》经验,为你挑选了2个好方法。

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

谢谢!Evan Teran和sep61.myopenid.com的回答是正确的,非常好!我的方式是错的,我希望任何人写这样的代码都可以避免我的愚蠢错误.

我的项目中的单例A有一个智能指针向量,另一个线程也可以编辑这个向量,所以当应用程序关闭时,即使我添加了很多CMutex,它总是变得不稳定.多线程错误+单身错误浪费了我一天.

// ------------------------------------------------ -----------新单例,如果您认为以下示例中存在任何问题,欢迎您进行编辑:

class A {
    private:
        static A* m_pA;
        explicit A();
        void A(const A& a);
        void A(A &a);
        const A& operator=(const A& a);
        virtual ~A();

    public:
        static A* GetInstance();
        static void FreeInstance();

        void WORK1();
        void WORK2();
        void WORK3();
    }
}

A* A::GetInstance() {
    if (m_pA == NULL){
        static A self;
        m_pA = &self;
    }
    return m_pA;
}

A::~A() {
}

Martin York.. 197

为什么每个人都希望将单例作为指针返回?
返回它作为参考似乎更合乎逻辑!

你永远不能手动释放单身人士.你怎么知道谁在提到单身人士?如果您不知道(或不能保证)没有人有引用(在您的情况下通过指针),那么您没有业务释放该对象.

在函数方法中使用static.
这保证了它只被创建和销毁一次.它还免费为您提供延迟初始化.

class S
{
    public:
        static S& getInstance()
        {
            static S    instance;
            return instance;
        }
    private:
        S() {}
        S(S const&);              // Don't Implement.
        void operator=(S const&); // Don't implement
 };

请注意,您还需要将构造函数设为私有.还要确保覆盖默认的复制构造函数和赋值运算符,这样就不能复制单例(否则它不会是单例).

另请阅读:

/sf/ask/17360801/

Singleton:如何使用它

C++ Singleton设计模式

确保您使用单身人员是出于正确的原因.

虽然在一般情况下技术上不是线程安全的,但请参阅:
C++函数中静态变量的生命周期是多少?

海湾合作委员会有一个明确的补丁来弥补这一点:http:
//gcc.gnu.org/ml/gcc-patches/2004-09/msg00265.html



1> Martin York..:

为什么每个人都希望将单例作为指针返回?
返回它作为参考似乎更合乎逻辑!

你永远不能手动释放单身人士.你怎么知道谁在提到单身人士?如果您不知道(或不能保证)没有人有引用(在您的情况下通过指针),那么您没有业务释放该对象.

在函数方法中使用static.
这保证了它只被创建和销毁一次.它还免费为您提供延迟初始化.

class S
{
    public:
        static S& getInstance()
        {
            static S    instance;
            return instance;
        }
    private:
        S() {}
        S(S const&);              // Don't Implement.
        void operator=(S const&); // Don't implement
 };

请注意,您还需要将构造函数设为私有.还要确保覆盖默认的复制构造函数和赋值运算符,这样就不能复制单例(否则它不会是单例).

另请阅读:

/sf/ask/17360801/

Singleton:如何使用它

C++ Singleton设计模式

确保您使用单身人员是出于正确的原因.

虽然在一般情况下技术上不是线程安全的,但请参阅:
C++函数中静态变量的生命周期是多少?

海湾合作委员会有一个明确的补丁来弥补这一点:http:
//gcc.gnu.org/ml/gcc-patches/2004-09/msg00265.html


引用的另一个好处是不可能这样做:'delete A :: getInstance()',这可以通过指针实现.
我想每个人都希望过早地进行优化,并且当他们做指针时他们感觉自己处于控制之中.但是,即使是'static S instance'子句也要编译为线程安全的构造!是吗?

2> Evan Teran..:

您可以通过使用这样的静态对象来避免需要删除它:

if(m_pA == 0) {
    static A static_instance;
    m_pA = &static_instance;
}


注意:如果你使用的是多线程,你应该非常小心这样做.请参阅http://stackoverflow.com/questions/246564/what-is-the-lifetime-of-a-static-variable-in-ac-function,了解为什么一般来说这是一个非常糟糕的主意.
http://www.aristeia.com/Papers/DDJ_Jul_Aug_2004_revised.pdf是关于C++中双重检查锁定问题的一个很好的参考.
只是不要尝试使用双重锁定来实现它,因为这不能在C++中正常工作(有关详细信息,请参阅google).
最好的方法是解耦引用和创建,并让主线程在启动任何可能引用单例的线程之前创建所有单例.顺便说一句,返回引用在大多数情况下优于返回指针...
推荐阅读
linjiabin43
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有