最近我碰到了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)
从这个声明我可以推断出实例字段是在堆上启动的.这意味着存在内存分配.对我来说完全不清楚的是,什么时候内存将被解除分配?还是有漏洞和内存泄漏?好像在实施中存在问题.
我的主要问题是,如何以正确的方式实施它?
如果变量声明为static在函数的作用域中,则仅初始化一次并在函数调用之间保留其值.它的生命到底是什么?它的构造函数和析构函数何时被调用?
void foo()
{
static string plonk = "When will I die?";
}
Run Code Online (Sandbox Code Playgroud) 编辑:从另一个问题我提供了一个答案,链接到很多关于单身人士的问题/答案:有关单身人士的更多信息:
所以我读过Singletons的帖子:好的设计还是拐杖?
争论仍然激烈.
我认为单身人士是一种设计模式(好的和坏的).
Singleton的问题不是模式而是用户(对不起所有人).每个人和他们的父亲都认为他们可以正确地实施一个(而且从我做过的许多采访中,大多数人都做不到).此外,因为每个人都认为他们可以实现正确的Singleton,他们滥用模式并在不合适的情况下使用它(用Singletons替换全局变量!).
所以需要回答的主要问题是:
我对这篇文章的希望是,我们可以在一个地方收集(而不是谷歌和搜索多个网站)一个权威的来源,了解何时(以及如何)正确使用单身人士.同样合适的还有一份反用法和常见的不良实施清单,解释了为什么他们无法工作以及为了实现他们的弱点.
所以让球滚动:
我会举起手来说这是我用的,但可能有问题.
我喜欢"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) 正如标题所说.我如何创建一个全局可用的类的实例(例如,我有一个打印的仿函数,我希望有一个这样的全局实例(虽然可以创建更多)).
我实现了像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)
有人能说出来,有什么不对并解释一下吗?谢谢.
这个问题是关于在工作线程中使用单个对象的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)