单例模式学习[已迁移]
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();
析构函数依旧不会被执行。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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中函数是传值还是传引用