gpt4 book ai didi

c++ - 单例的析构函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:33:00 25 4
gpt4 key购买 nike

问题:我是否应该为具有程序作用域的单例编写析构函数(程序启动时活跃,程序结束时死亡)

详细信息:

我在一个问题上进退两难

“我应该为单例类编写析构函数吗?”

1) 这个类有程序作用域2) 类在堆上使用大量内存,因此释放需要时间

当用户退出程序时,响应应该很快,那么为什么要花时间释放这个单例占用的内存,因为内存将在程序结束时释放。

最佳答案

如果释放内存需要很长时间,那就不要做。这可能是一个大而耗时的问题,尤其是在释放内存导致大量缓存未命中的情况下。操作系统将完成这项工作(当然,如果您在实际执行该工作的系统上运行)。

但是,如果您的析构函数对某些资源进行终结(例如,解锁文件或硬件),并且您使用“资源获取即初始化”,则必须确保调用正确的析构函数(例如,那些静态对象在 main() 函数返回后被调用)。 如果在您的单例中分配的某些对象也锁定资源,这也适用!

因此,在大多数情况下,实际上为此类对象编写一个析构函数并使其释放内存可选会更好。


SSS提出问题的人决定根本不写析构函数。但是,我想多说一点,这不是最好的解决方案。

不为静态对象(我们称之为“静态”)释放内存是一种非常微妙的优化,它与常识和人们通常编写程序的方式相矛盾。您的代码分配内存但没有析构函数,看起来很奇怪。同龄人会认为该类(class)写得不好,往往会在其中寻找错误(而他们在其他类(class)中)。

相反,您应该遵守通用编码标准,这些标准规定 C++ 中的内存管理应该是正确的。一定要写一个析构函数,只有在它表明它对不释放有显着提升之后,才包装代码以使其不被调用。

不释放内存的意图必须明确

MySingleton::~MySingleton()
{
#ifndef RELEASE
// The memory will be released by OS when program terminates!
delete ptr1;
delete ptr2;
#endif
}

甚至

MySingleton::~MySingleton()
{
// We don't do anything here.
// The memory will be released by OS when program terminates!
}

但析构函数更适合持久化。

关于c++ - 单例的析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1481041/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com