代码的本意:静态成员函数getInstance获取单例指针,并且在析构函数中做一些扫尾事情。
运行代码后创造析构函数去世活不实行,难道一个单例模式都能写错?反复确认,没创造问题所在,于是上万能的StackOverflow上找缘故原由。恰好有伙计有同样的迷惑,有哥们给出了一个可行的方案。根据其答案修正代码如下:
比拟前一段代码,紧张改动是移除了静态指针成员,改用函数内的静态成员。由于_instance是函数内的静态成员,在首次调用时被初始化(感谢无参布局函数),之后调用将略过初始化而实行后续代码;函数返回实例的引用,故而每次调用得到的是同一个工具,达到了单例的目的;程序实行结束后,实例的析构函数被自动调用,析构函数中的代码精确实行。

问题办理了,但什么缘故原由造成第一段单例代码的析构函数不实行呢?
这是由于C++持有工具的办法造成的(或者说C++许可程序员手动掌握内存引起)。Java/PHP等带有回收机制的措辞,持有工具的办法是通过指针,程序员申请工具后会自动分配内存,系统卖力跟踪和回收无用的工具和存在。C++许可开拓职员以变量的办法持有工具,例如:Foo foo [= Foo(args)]。变量初始化后得到工具的引用,离开浸染域后,系统销毁实行栈,工具自动被析构。C++也可以以指针的形式得到工具的引用: Foo foo = new Foo(args)。这种办法分配的工具,须要开拓职员手动管理。如果不实行delete,工具和分配的内存将一贯存在,直到程序退出后,才由操作系统回收。如下代码可解释这点:
从上面的代码可以看出,工具没有引用计数的情形下,编译器和系统不敢随便回收new出来的工具内存:多个指针指向同一个工具,delete了工具可能会导致其他代码崩溃;开释内存后,其他指针再delete会多次delete同一块内存,引发不可预知风险。
综上,指针单例析构函数没有被调用的缘故原由是: 自己new的工具,须要自己delete,别指望别人帮你精确调用析构函数。
问题的办理方案有以下几种:
(1)同StackOverflow上回答,改用变量办法持有单例工具。程序运行结束前会销毁所有变量,变量的析构函数将被精确调用;
(2)在main函数退出前delete单例。例如增加一个destroy的静态成员函数,将指针指向的工具销毁;
(3)利用auto_ptr/unique_ptr等智能指针。
如有其它办理方案,欢迎互换示正!
那么本日的分享就到这里了,后续会更新更多精彩项目或者知识内容的,大家要好好学C措辞C++哟~
写在末了:对付准备学习C/C++编程的小伙伴,如果你想更好的提升你的编程核心能力(内功)不妨从现在开始!
编程学习书天职享:
编程学习视频分享:
整理分享(多年学习的源码、项目实战视频、项目条记,根本入门教程)
欢迎转行和学习编程的伙伴,利用更多的资料学习发展比自己琢磨更快哦!
对付C/C++感兴趣可以关注小编在后台私信我:【编程互换】一起来学习哦!
可以领取一些C/C++的项目学习视频资料哦!
已经设置好了关键词自动回答,自动领取就好了!