单例中的指针释放问题

c_rrb 2013-12-28 10:13:08

#include <iostream>

template<class T>
class Singleton//单例模式
{
protected: ///不能单独定义对象
Singleton() {}
virtual ~Singleton() {}
public:
class garbo//
{
public:
~garbo()
{
delete Singleton<T>::ptr;
std::cout<<"+++\n";///TEST
}
};
public:
static T *get()
{
if(ptr==NULL) ptr = new T;
return ptr;
}

protected:
static T *ptr;
static garbo gb;///
};
template<class T>
T* Singleton<T>::ptr=NULL;

template<class T>
typename Singleton<T>::garbo Singleton<T>::gb;

class sig:public Singleton<sig>///
{
friend sig* Singleton<sig>::get();
sig() {}
public:
~sig() {}
void show()const{std::cout<<"TEST\n";}
};
int main()
{
sig::get()->show();

return 0;
}

///Singleton::garbo的析构函数为什么得不到执行???
...全文
300 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
lm_whales 2013-12-29
  • 打赏
  • 举报
回复
整个C,C++库代码
lm_whales 2013-12-29
  • 打赏
  • 举报
回复
这种类型的单例模式,实质上会有内存泄露,虽然不明显,影响也很小,甚至可能没有影响 就是你使用了,一般也不会析构。 因为指针指向的内存是动态分配的,你的指针生存周期是整个程序执行期间, 这个只能在你的代码里,直接释放才行,它是不会动态释放的。 C,C++指针本身,不会自动释放动态分配的内存。 要自动释放内存,就需要把指针封装起来。 如果你的 main函数执行结束,还没有释放指针指向的内存,这就是一个标准的内存泄露。 因为 除非 atexit ,以及外部,静态变量的析构函数外,没有办法在函数main 外部,main函数结束执行释放内存的代码。 除非,整个C库代码,都是你自己写的。
vipcxj 2013-12-29
  • 打赏
  • 举报
回复
引用 4 楼 zhaokai115 的回复:
单例的释放问题比较复杂,带来的麻烦远比好处多,所以一般讲单例都不提释放问题。比如 1. 释放后,如果还有人拥有单例的指针,要继续对它操作肿么办? 2. 释放后,如果有人想getInstance(),怎么返回原来的对象?(这时创建新对象那还是单例吗?)
那是你根本不会用单例,单例基本就是用来代替生命期贯穿整个程序的全局变量,当单例释放了,程序也就结束了,怎么可能还会出现你说的问题。 http://www.cppblog.com/dyj057/archive/2005/09/20/346.html 上面这个博客里的单例实现还是不错滴,供LZ参考
zhaokai115 2013-12-29
  • 打赏
  • 举报
回复
单例的释放问题比较复杂,带来的麻烦远比好处多,所以一般讲单例都不提释放问题。比如 1. 释放后,如果还有人拥有单例的指针,要继续对它操作肿么办? 2. 释放后,如果有人想getInstance(),怎么返回原来的对象?(这时创建新对象那还是单例吗?)
vipcxj 2013-12-28
  • 打赏
  • 举报
回复
因为你从头到位没用到garbo gb,所以作为模板,这东西压根没实例化,也就是说根本没这东西。模板是你用到哪个就实例化那个,你没用到的东西一律不实例化

64,643

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧