相关疑难解决方法(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万
查看次数

C++函数中静态变量的生命周期是多少?

如果变量声明为static在函数的作用域中,则仅初始化一次并在函数调用之间保留其值.它的生命到底是什么?它的构造函数和析构函数何时被调用?

void foo() 
{ 
    static string plonk = "When will I die?";
}
Run Code Online (Sandbox Code Playgroud)

c++ static lifetime

359
推荐指数
4
解决办法
17万
查看次数

Singleton:如何使用它

编辑:从另一个问题我提供了一个答案,链接到很多关于单身人士的问题/答案:有关单身人士的更多信息:

所以我读过Singletons的帖子:好的设计还是拐杖?
争论仍然激烈.

我认为单身人士是一种设计模式(好的和坏的).

Singleton的问题不是模式而是用户(对不起所有人).每个人和他们的父亲都认为他们可以正确地实施一个(而且从我做过的许多采访中,大多数人都做不到).此外,因为每个人都认为他们可以实现正确的Singleton,他们滥用模式并在不合适的情况下使用它(用Singletons替换全局变量!).

所以需要回答的主要问题是:

  • 什么时候应该使用Singleton
  • 如何正确实现Singleton

我对这篇文章的希望是,我们可以在一个地方收集(而不是谷歌和搜索多个网站)一个权威的来源,了解何时(以及如何)正确使用单身人士.同样合适的还有一份反用法和常见的不良实施清单,解释了为什么他们无法工作以及为了实现他们的弱点.


所以让球滚动:
我会举起手来说这是我用的,但可能有问题.
我喜欢"Scott Myers"在他的书"Effective C++"中处理这个主题

使用单身人士的好情况(不是很多):

  • 记录框架
  • 线程回收池
/*
 * C++ Singleton
 * Limitation: Single Threaded Design
 * See: http://www.aristeia.com/Papers/DDJ_Jul_Aug_2004_revised.pdf
 *      For problems associated with locking in multi threaded applications
 *
 * Limitation:
 * If you use this Singleton (A) within a destructor of another Singleton (B)
 * This Singleton (A) must be fully constructed before the constructor of (B)
 * is called.
 */
class MySingleton
{ …
Run Code Online (Sandbox Code Playgroud)

c++ singleton design-patterns

285
推荐指数
9
解决办法
17万
查看次数

C++中类的全局实例

正如标题所说.我如何创建一个全局可用的类的实例(例如,我有一个打印的仿函数,我希望有一个这样的全局实例(虽然可以创建更多)).

c++ singleton

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

在单例中使用已删除的复制构造函数

我实现了像Singleton模式这个,还有我的代码:

头文件:

class Settings_manager{
public:
    static Settings_manager& get_instance();

    void operator=(Settings_manager const&) =delete;
    Settings_manager(Settings_manager const&) =delete;
...

private:
    Settings_manager();
};
Run Code Online (Sandbox Code Playgroud)

执行:

Settings_manager& Settings_manager::get_instance()
{
    static Settings_manager instance;
    return instance;
}

Settings_manager::Settings_manager()
{
    read_file();
}
Run Code Online (Sandbox Code Playgroud)

当我尝试使用这样的get_instance函数main:

Settings_manager set = Settings_manager::get_instance();
Run Code Online (Sandbox Code Playgroud)

要么 Settings_manager set = std::move(Settings_manager::get_instance());

我明白了

error: use of deleted function 'Settings_manager::Settings_manager(const Settings_manager&)'
 Settings_manager set = Settings_manager::get_instance();
Run Code Online (Sandbox Code Playgroud)

有人能说出来,有什么不对并解释一下吗?谢谢.

c++ singleton c++11 c++14

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

线程工作者方法中的Singleton getInstance

这个问题是关于在工作线程中使用单个对象的getter方法.这是一些伪代码:

// Singleton class which contains data
class MyData
{
    static MyData* sMyData ;

    int  mData1[1024];
    int  mData2[1024];
    int  mData3[1024];

    MyData* getInstance()
    {
        // sMyData is created in the very beginning.
        return sMyData ;
    }

    void getValues(int idx, int& data1,int& data2,int& data3)
    {
        data1 = mData1[idx];
        data2 = mData2[idx];
        data3 = mData3[idx];
    }

    int* getData1()
    {
        return &mData1[0];
    }
}

class MyThread
{
    void workerMethod()
    {
        MyData* md = MyData::getInstance();

        int d1,d2,d3;
        md->getValue( 12, d1,d2,d3 );

        int* data1 = md->getData1(); …
Run Code Online (Sandbox Code Playgroud)

c++ multithreading

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