单例实现有什么问题?
What's wrong with Singleton implementation?
请仔细阅读问题。
我使用这个基类为我的类型,我需要单例模式:
#pragma once
template<typename T>
class singleton
{
private:
static T* g_pInstance;
public:
static T* getInstance() { return g_pInstance; }
public:
singleton() { g_pInstance = (T*)this; }
~singleton() { if(g_pInstance == this) g_pInstance = nullptr; }
};
template<typename T>
T* singleton<T>::g_pInstance = nullptr;
用法(没有*cpp文件):
class Any : public singleton<Any> { /* Done */ }
然而,现在我有一个奇怪的情况使用这样的类从静态库,g_pInstance
指针已经设置为0xccccccc
(没有初始化为零),之前一切都很好。
原因是什么?
UPDATE: compiler: vs 2013 x86
查看一个简单的单例实现声明为GetInstance方法静态变量的单例实例
这消除了实例指针初始化问题。和Luu一样,VC给未初始化的指针赋值0xcccccccc。正如许多人批评的那样,单例是不好的,但我仍然不能完全避免它:-(
试着回答为什么调用getInstance时实例指针不是nullptr。我假设应用程序中有不同的编译单元。如果张贴的代码在编译单元A中,并且实例指针存在于该编译单元A的静态作用域中。我还假设存在一个编译单元B,它有一个在编译单元B的静态作用域中声明的类Any对象。因为c++运行时只保证同一编译单元内的初始化顺序,而不是跨多个编译单元的初始化顺序。编译单元B中类Any对象的初始化可能发生在编译单元a中的实例指针初始化之前,这将导致调用getInstance时在实例指针中观察到0xcccccccc
MSVC在初始化模板静态时存在一些问题。这不是你的个案所特有的。
我相信这可能是一个解决方案:
template<> Any* singleton<Any>::g_pInstance = nullptr;
你的单例并不完全是线程安全的,但我想你已经知道了:-)
实现一个单例,而不将其暴露给类,因此您不需要在源代码中初始化它。创建私有构造函数和复制构造函数。我不知道你为什么需要选角之类的东西。你可以这样做:
#pragma once
template<typename T>
class singleton
{
private:
singleton();
singleton(const singleton&);
public:
static T& getInstance()
{
static T instance;
return instance;
}
};
我同意那些抱怨你的"单例"类的人——它支持多个实例,所以它不是标准意义上的单例。但是如果我正确理解了你的问题,真正困扰你的是Any::getInstance()
没有被nullptr
赋值初始化,对吗?
如果是这样,这是一个我无法在g++ (GCC) 4.8.3, clang版本3.4.2或ideone上重现的问题。我建议尝试在不同的编译器上使用精确的代码,看看是否可以在那里重现错误。如果不能,这可能是编译器的问题:因为据我所知,您使用的初始化行确实是初始化静态模板数据成员的正确方法。
- 警告处理为错误这里有什么问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 当我尝试添加 2 个大字符串时,我无法弄清楚出了什么问题
- 违反const正确性:我应该现实地期待什么问题
- 这个带有模板<类 Vector 的C++代码片段有什么问题>
- 我的逻辑反转字符串中的元音有什么问题?
- 需要以下代码的帮助,下面的代码有什么问题
- 常量公共成员有什么问题?
- c++无值sort()的问题是什么?
- 以下代码中的函数模板有什么问题?
- 这个返回元素位置的基于循环的函数有什么问题?
- creat_list2功能有什么问题?
- 基本的 c++ 问题:如果我在函数中创建某些内容并返回它会发生什么?
- 我遇到了黑客排名中的问题"TWO STRINGS"的三个测试用例的分段错误。原因是什么?
- 什么是钻石问题?是一系列问题还是特定问题?
- 格式说明符C++有什么问题
- 我应该在 main 函数中写什么来测试我的问题?
- 任何人都可以告诉我我的 C++ 代码出了什么问题?
- 方法问题 - 什么会改变值,什么不会改变?什么是无效的?