编程题
1、实现单例模式的自动释放(4种方式)
1.1友元类实现单例模式的释放。
知识点:
要实现自动释放,可以考虑用一个栈对象,一个类在栈上创建一个对象,在程序执行结束后,栈对象空间被自动释放,会去调用该类的析构函数。把释放单例模式指针的代码放在该类中就可以实现自动释放。
#include <iostream>
using namespace std;
class AutoRelease;//1.要在单例模式中作为友元,所以先进行声明
class Singleton//2.单例模式类。
{
friend class AutoRelease;//自动释放友元
public:
static Singleton *get_Instance()//获取单例指针的接口,静态
{
if(nullptr==_pInstance) //指针为空的时候才创建,一开始设单例指针为nullptr,在多线程的时候会出问题,这里不考虑多线程的情况,不过也好解决。
{
_pInstance = new Singleton();//单例指针不存在的情况下就创建
}
return _pInstance;//不空直接返回当前指针
}
private://构造函数和析构函数放在私有权限下,为了防止创建多个对象
Singleton()//构造函数
{
cout<<"Singleton()"<<endl;
};
~Singleton()//析构
{
cout<<"~Singleton()"<<endl;
}
static Singleton *_pInstance;//静态单例指针,类内声明,类外定义
};
Singleton *Singleton::_pInstance = nullptr;//饱汉
class AutoRelease
{
public:
AutoRelease()
{
cout<<"AutoRelease()"<<endl;
}
~AutoRelease()
{
if(Singleton::_pInstance) //栈对象销毁时自动调用,释放单例指针的函数放在友元类的析构函数里
{
delete Singleton::_pInstance;
Singleton::_pInstance = nullptr;
cout<<"delete _pInstance"<<endl;
}
cout<<"AutoRelease"<<endl;
}
};
void test01()
{
Singleton *ps1 = Singleton::get_Instance();
Singleton *ps2 = Singleton::get_Instance();
cout<<ps1<<endl;
cout<<ps2<<endl;
AutoRelease ar;//自动释放。
}
int main()
{
test01();
return 0;
}
1.2 嵌套类释放单例模式指针
注意点:
1.把释放类放在单例类里面,单例模式类里面多一个释放类对象,必须是静态变量,为何?
释放类的对象不能作为普通成员函数,如果作为普通成员函数,单例指针无法进行释放,释放类对象和单例指针作为同一个类的成员,由于在同样的作用域下,Singleton和AutoRelease的析构函数形成死锁(这种情况下,Release类对象的释放要Singleton的析构函数执行才能销毁,而Singleton的销毁又需要Release的析构函数执行才能完成)。
因此,释放类的对象不能和单例指针在同一作用域下,而作为静态变量,程序执行结束后,释放类对象被销毁,其析构函数被调用,单例类才能被销毁。
#include <iostream>
using namespace std;
class Singleton
{
public:
class AutoRelease //嵌套类
{
public:
AutoRelease()
{
cout<<"AutoRelease()"<<endl;
}
~AutoRelease()
{
if(_pInstance)//释放函数写在自动类的析构函数里,程序执行结束自动释放