单例模式学习[已迁移]

1、例子

如果单例对象是类的static成员,那么在程序结束时不会调用类的析构函数,如下:

复制代码
#include <iostream>
using namespace std;
 
class A{
private:
    static A* m_ins;//声明,静态指针成员
    A(){}
public:
    static A* getIns(){
        if(m_ins==NULL){
            m_ins=new A();
        }
        return m_ins;
    }
    void test(){
      cout<<"testA\n";
    }
    ~A(){
        cout<<"~A destruction\n";
    }
};

A* A::m_ins=nullptr;//定义
int main()
{
    A* a=A::getIns();
    a->test();
    return 0;
}
复制代码

输出:

testA

需要在返回前单独添加delete A; 否则是会有内存泄漏的风险的,不过上述的例子,程序结束后,操作系统会回收。 

使用new创建对象,需要开发人员手动管理。如果不执行delete,对象和分配的内存将一直存在,直到程序退出后,才由操作系统回收。

将静态指针成员改为函数内的静态变量: 

复制代码
class A{
private:
    A(){}
public:
    static A& getIns(){//返回引用
        static A m_a;
        return m_a;
    }
static A* getIns(){
  static A m_a;
return & m_a;
}
}; int main() { A::getIns().test(); return 0; } #输出: -> % ./Demo testA ~A destruction
复制代码

如果使用如下: 

复制代码
    static A* getIns(){
        static A* m_a;
        if(m_a==nullptr){
            m_a = new A();
        }
        return m_a;
    }
main:
A::getIns()->test();
复制代码

析构函数依旧不会被执行。

 

posted @   lypbendlf  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
历史上的今天:
2020-06-14 numpy.copy和torch.tensor的cpu/gpu
2020-06-14 F1值的优化macro
2020-06-14 py中函数是传值还是传引用
点击右上角即可分享
微信分享提示