C++实现单例模式时的销毁有关问题,
C++实现单例模式时的销毁问题,在线等~~~
再讲到单例模式的销毁时,在网上看到以下一段话:
我们知道,程序在结束的时候,系统会自动析构所有的全局变量。事实上,系统也会析构所有的类的静态成员变量,就像这些静态成员也是全局变量一样。利用这个特征,我们可以在C++单例模式类中定义一个这样的静态成员变量,而它的唯一工作就是在析构函数中删除单例类的实例。如下面的代码中的CGarbo类(Garbo意为垃圾工人):
class CSingleton:
{
// 其它成员
public:
static CSingleton * GetInstance(){。。。}
private:
CSingleton(){};
static CSingleton * m_pInstance;
class CGarbo // 它的唯一工作就是在析构函数中删除CSingleton的实例
{
public:
~CGarbo()
{
if (CSingleton::m_pInstance)
delete CSingleton::m_pInstance;
}
};
static CGarbo Garbo; // 定义一个静态成员,在程序结束时,系统会调用它的析构函数
}
类CGarbo被定义为CSingleton的私有内嵌类,以防该类被在其它地方滥用。
在程序运行结束时,系统会调用CSingleton的静态成员Garbo的析构函数,该析构函数会删除单例的唯一实例。
使用这种方法释放单例对象有以下特征:
1.在单例类内部定义专有的嵌套类。
2.在单例类内定义私有的专门用于释放的静态成员。
3.利用程序在结束时析构全局变量的特性,选择最终的释放时机。
4.使用C++单例模式的代码不需要任何操作,不必关心对象的释放。
我就不明白了,这样销毁单例,有什么意义?求指导。
------解决方案--------------------
1、RAll机制:利用c++的构造与析构特性自动回收资源,智能指针就属于这一类,还有自动关闭句柄等。
2、利用静态局部对象的单例模式:
------解决方案--------------------
再强调一下:
至于意义嘛,你new的指针,你不负责释放你不觉得过分么?这是良好,安全的编程习惯。
你的类里简单,就是开辟了点内存,退出就销毁了,是无所谓,但是如果稍微复杂点呢?和硬件建立了个连接没有关闭?锁定了系统的资源没有解锁?没有给服务器发退出消息?你觉得合理么?
------解决方案--------------------
有引用计数的智能指针是共享型的,当共享计数为0时自动释放。
a为什么没有被释放?你觉得这个静态对象的析构函数不会被调用吗?为什么?
这里有些讨论:http://*.com/questions/1463707/c-singleton-vs-global-static-object
------解决方案--------------------
再讲到单例模式的销毁时,在网上看到以下一段话:
我们知道,程序在结束的时候,系统会自动析构所有的全局变量。事实上,系统也会析构所有的类的静态成员变量,就像这些静态成员也是全局变量一样。利用这个特征,我们可以在C++单例模式类中定义一个这样的静态成员变量,而它的唯一工作就是在析构函数中删除单例类的实例。如下面的代码中的CGarbo类(Garbo意为垃圾工人):
class CSingleton:
{
// 其它成员
public:
static CSingleton * GetInstance(){。。。}
private:
CSingleton(){};
static CSingleton * m_pInstance;
class CGarbo // 它的唯一工作就是在析构函数中删除CSingleton的实例
{
public:
~CGarbo()
{
if (CSingleton::m_pInstance)
delete CSingleton::m_pInstance;
}
};
static CGarbo Garbo; // 定义一个静态成员,在程序结束时,系统会调用它的析构函数
}
类CGarbo被定义为CSingleton的私有内嵌类,以防该类被在其它地方滥用。
在程序运行结束时,系统会调用CSingleton的静态成员Garbo的析构函数,该析构函数会删除单例的唯一实例。
使用这种方法释放单例对象有以下特征:
1.在单例类内部定义专有的嵌套类。
2.在单例类内定义私有的专门用于释放的静态成员。
3.利用程序在结束时析构全局变量的特性,选择最终的释放时机。
4.使用C++单例模式的代码不需要任何操作,不必关心对象的释放。
我就不明白了,这样销毁单例,有什么意义?求指导。
------解决方案--------------------
1、RAll机制:利用c++的构造与析构特性自动回收资源,智能指针就属于这一类,还有自动关闭句柄等。
2、利用静态局部对象的单例模式:
static A& getInstance()
{
static A a;
return a;
}
------解决方案--------------------
谢谢你的回答。让我受益匪浅,我接着有如下疑问,你说到:静态对象和全局对象都会在程序结束时被系统负责析构。在程序结束时,在程序结束时,会释放该程序占用的所有资源。还有必要认为去控制内存的释放吗?
再强调一下:
至于意义嘛,你new的指针,你不负责释放你不觉得过分么?这是良好,安全的编程习惯。
你的类里简单,就是开辟了点内存,退出就销毁了,是无所谓,但是如果稍微复杂点呢?和硬件建立了个连接没有关闭?锁定了系统的资源没有解锁?没有给服务器发退出消息?你觉得合理么?
------解决方案--------------------
这样是所谓的RAll机制自动销毁,也可以定义一个静态函数释放单实例指针,但需要你记得调用它。还有的实现方法是在静态函数内定义静态局部对象。
谢谢你的回答,对于所谓的RAll机制自动销毁和在静态函数内定义静态局部对象,有一些不清楚?能否进行说明一下?拜托了。在静态函数内定义静态局部对象是什么机制?
1、RAll机制:利用c++的构造与析构特性自动回收资源,智能指针就属于这一类,还有自动关闭句柄等。
2、利用静态局部对象的单例模式:static A& getInstance()
{
static A a;
return a;
}
智能指针,不是使用的引用计数么?这个a貌似没有被释放。我个人认为。如果有不对的地方,请指正,拜托了。
有引用计数的智能指针是共享型的,当共享计数为0时自动释放。
a为什么没有被释放?你觉得这个静态对象的析构函数不会被调用吗?为什么?
这里有些讨论:http://*.com/questions/1463707/c-singleton-vs-global-static-object
------解决方案--------------------
这样是所谓的RAll机制自动销毁,也可以定义一个静态函数释放单实例指针,但需要你记得调用它。还有的实现方法是在静态函数内定义静态局部对象。
谢谢你的回答,对于所谓的RAll机制自动销毁和在静态函数内定义静态局部对象,有一些不清楚?能否进行说明一下?拜托了。在静态函数内定义静态局部对象是什么机制?
1、RAll机制:利用c++的构造与析构特性自动回收资源,智能指针就属于这一类,还有自动关闭句柄等。
2、利用静态局部对象的单例模式:static A& getInstance()
{
static A a;
return a;
}
智能指针,不是使用的引用计数么?这个a貌似没有被释放。我个人认为。如果有不对的地方,请指正,拜托了。
有引用计数的智能指针是共享型的,当共享计数为0时自动释放。
a为什么没有被释放?你觉得这个静态对象的析构函数不会被调用吗?为什么?
这里有些讨论:http://*.com/questions/1463707/c-singleton-vs-global-static-object/*
#include <iostream>
using namespace std;
class Singleton
{
public:
static Singleton *GetInstance()
{
if (m_Instance == NULL)
{
m_Instance = new Singleton();
}
return m_Instance;
}
int GetTest()
{
return m_Test;
}
private:
Singleton(){ m_Test = 10; }
static Singleton *m_Instance;
int m_Test;
// This is important
class GC
{
public:
~GC()
{
// We can destory all the resouce here, eg:db connector, file handle and so on
if (m_Instance != NULL)
{
cout<<"Call the GC's destructor"<<endl;
delete m_Instance;
m_Instance = NULL;