首页 » 网站推广 » phpfunction不履行技巧_C常识分享为什么单例代码的析构函数有时刻不实行呢

phpfunction不履行技巧_C常识分享为什么单例代码的析构函数有时刻不实行呢

访客 2024-12-18 0

扫一扫用手机浏览

文章目录 [+]

代码的本意:静态成员函数getInstance获取单例指针,并且在析构函数中做一些扫尾事情。

运行代码后创造析构函数去世活不实行,难道一个单例模式都能写错?反复确认,没创造问题所在,于是上万能的StackOverflow上找缘故原由。
恰好有伙计有同样的迷惑,有哥们给出了一个可行的方案。
根据其答案修正代码如下:

phpfunction不履行技巧_C常识分享为什么单例代码的析构函数有时刻不实行呢

比拟前一段代码,紧张改动是移除了静态指针成员,改用函数内的静态成员。
由于_instance是函数内的静态成员,在首次调用时被初始化(感谢无参布局函数),之后调用将略过初始化而实行后续代码;函数返回实例的引用,故而每次调用得到的是同一个工具,达到了单例的目的;程序实行结束后,实例的析构函数被自动调用,析构函数中的代码精确实行。

phpfunction不履行技巧_C常识分享为什么单例代码的析构函数有时刻不实行呢
(图片来自网络侵删)

问题办理了,但什么缘故原由造成第一段单例代码的析构函数不实行呢?

这是由于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++的项目学习视频资料哦!
已经设置好了关键词自动回答,自动领取就好了!

标签:

相关文章

php常量率低技巧_PHP 常量详解教程

PHP 常量常量是单个值的标识符(名称)。在脚本中无法改变该值。有效的常量名以字符或下划线开头(常量名称前面没有 $ 符号)。注释...

网站推广 2024-12-19 阅读0 评论0