C++学习之第九天-自动释放单例模式

本文介绍了C++中四种自动释放单例模式的方法,包括友元类、嵌套类、atexit函数和pthread+atexit,并详细讲解了每种方法的原理和注意事项。同时,文章探讨了Copy-on-Write(COW)原理,并展示了如何实现一个能区分读写操作的COW String类,包括其operator[]的优化。最后,总结了String类的运算符重载,如赋值、+=、[]、关系运算符和输入输出运算符。
摘要由CSDN通过智能技术生成

编程题

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)//释放函数写在自动类的析构函数里,程序执行结束自动释放
          
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

给你。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值