为了避免内存泄漏,我不直接使用指向实例的指针,而是使用将处理删除指针的私有类.
这是我的实际代码(不工作):
template <typename T> class Singleton{private: class PointerInstance { private: T* instance; public: PointerInstance() : instance(0) {} ~PointerInstance() { delete instance; } // no memory leak ! T* Get() { if ( !instance ) { instance = new T(); } return instance; } }; static PointerInstance PInstance;public: static T* pGetInstance(voID) { return PInstance.pGet(); };protected: Singleton(voID){}; ~Singleton(voID){};};
这是典型的派生类声明应该是这样的:
class Child : public Singleton<Child>{ frIEnd class Singleton<Child>; Child(); // etc...};
基本上缺少的是我作为Singleton的每个T类的PInstance实例.
我的问题是:有没有办法一劳永逸地在包含上面代码的Singleton.h中使用一些通用代码行,或者除了为每个代码添加一些特定的代码行之外别无选择衍生类?
(Bonus:有没有更好的方法在C中做一个Singleton类?)
解决方法 这是一种编写CRTP Singleton而没有内存泄漏的简单方法:template <class T>class Singleton{ frIEnd class T;private: Singleton() {}; ~Singleton() {}; Singleton(const Singleton&); // not implemented const Singleton& operator=(const Singleton&); // not implementedpublic: static T* pGetInstance() { static T theInstance; return &theInstance; }};
用法与问题中的相同.
总结以上是内存溢出为你收集整理的在C中,如何初始化在Singleton模板中声明的私有类的静态成员?全部内容,希望文章能够帮你解决在C中,如何初始化在Singleton模板中声明的私有类的静态成员?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)