C++ 单例模式的虚构函数的调用

shwill123 2016-03-23 11:32:20
请教大家一个问题,我的单例类如下:
//*********************** Singleton.h file **********************
class Singleton
{
public:
static Singleton* getInstance();
int getia();
virtual ~Singleton(void);
private:
int ia;
Singleton(void);

//把复制构造函数,=操作符也设为私有,防止被复制
Singleton(const Singleton&);
Singleton& operator=(const Singleton&);

static Singleton *instance;
};

//*********************** Singleton.cpp file **********************
Singleton::Singleton(void)
{ ia = 7;
}
Singleton::~Singleton(void)
{ printf("sssssssssssssssssssss\n");
}
Singleton::Singleton(const Singleton&)
{
}
Singleton& Singleton::operator=(const Singleton&)
{
Singleton *p = 0;
return *p;
}
//在此处初始化(类的私有属性instance)
Singleton* Singleton::instance = new Singleton();
Singleton* Singleton::getInstance()
{ return instance;
}
int Singleton::getia()
{ return ia;
}
//********************main.cpp file*****************
void main()
{
Singleton *p1 = Singleton::getInstance();
}
运行得到程序为 Singleton.exe
问题:1、当程序退出是会调用虚构函数吗?如果会调用为什么,我该如何测试?(我自己通过命令行执行 Singleton.exe 后发现printf("sssssssssssssssssssss\n");还是无法输出,说明没调用虚构函数,
要在主函数中写上 delete Singleton::getInstance(); 后才调用,不是说静态成员变量的虚构函数会自动调用吗?)
...全文
358 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
shwill123 2016-03-23
  • 打赏
  • 举报
回复
追问: 这个实例是从程序运行开始 到 程序退出的整个期间都有可能用到的,像这样的变量需要调用delete 吗,需要在程序退出时释放对象吗?
幻夢之葉 2016-03-23
  • 打赏
  • 举报
回复
你只管new 而没有 delete,凭啥给你销毁 栈上的静态成员变量,在生命期结束的时候是会调用析构函数这没错 你在堆上创建的,就没理由给你销毁了!
ztenv 版主 2016-03-23
  • 打赏
  • 举报
回复
你至少应该在不用的时候释放吧?
encoderlee 版主 2016-03-23
  • 打赏
  • 举报
回复
静态成员变量的虚构函数会自动调用 static Singleton *instance; 但是你这里的静态成员变量是个指针,而非Singleton对象
encoderlee 版主 2016-03-23
  • 打赏
  • 举报
回复
Singleton* Singleton::instance = new Singleton() 你的单例实例是new出来的,如果不delete,当然不会调用析构函数,不只是单例模式如此,你在任何地方new了一个对象,但不delete,都不会调用析构函数。
encoderlee 版主 2016-03-23
  • 打赏
  • 举报
回复

#include <iostream>
using namespace std;

class Singleton
{
public:
static Singleton& GetInstance() { return s_instance; }
void Show() { cout << "调用了" << endl; }
private:
~Singleton() { cout << "析构了" << endl; }
static Singleton s_instance;
};

Singleton Singleton::s_instance;

void main()
{
Singleton::GetInstance().Show();
}

looklzg1108 2016-03-23
  • 打赏
  • 举报
回复
回复为何没有设置代码格式的地方。
looklzg1108 2016-03-23
  • 打赏
  • 举报
回复
template<typename SingletonType>
void CSingletonClass<SingletonType>::DestroyInstance()
{
if (s_pSingleInstance != NULL)
{
delete s_pSingleInstance;
}

s_pSingleInstance = NULL;
}
jiqiang01234 2016-03-23
  • 打赏
  • 举报
回复
只要内存不会随着时间增加,单例模式可以不用释放内存

64,654

社区成员

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

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