C++ 单态析构函数

C++ 单态析构函数,c++,singleton,C++,Singleton,问题:我是否应该为具有程序作用域的单例编写析构函数(程序启动时激活,程序结束时终止) 详细信息: 我在这个问题上进退两难 “我是否应该为单例类编写析构函数?” 1) 该类具有程序范围 2) 类在堆上使用了大量内存,所以释放这些内存需要时间 当用户退出程序时,响应应该很快,所以为什么要花时间释放这个单例所占用的内存,因为程序将结束时内存将被释放。如果您在windows操作系统下运行,当应用程序关闭时,任何进程占用的所有内存/资源都将被回收,因此这并不重要。正如所指出的那样,操作系统无论如何都应该释

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

详细信息:

我在这个问题上进退两难

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

1) 该类具有程序范围 2) 类在堆上使用了大量内存,所以释放这些内存需要时间


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

如果您在windows操作系统下运行,当应用程序关闭时,任何进程占用的所有内存/资源都将被回收,因此这并不重要。

正如所指出的那样,操作系统无论如何都应该释放内存,但是您真的希望信任它来管理它吗?至少在显式销毁的情况下,一个有缺陷/设计糟糕的内存管理器有更多的机会使其正确


那时有两次机会把它做好。

听起来你在创建一个新的类,因此重新考虑你的类的设计可能是有益的


是否添加析构函数取决于是否值得释放并最终重新分配内存。如果释放内存需要很长时间,则不要这样做。这可能是一个大而耗时的问题,特别是当释放内存导致大量缓存未命中时。操作系统将完成这项工作(当然,如果您在实际执行此操作的系统上进行操作)

但是,如果析构函数完成了某些资源的终结(例如,解锁一个文件或一块硬件),并且使用“资源获取即初始化”,则必须确保调用正确的析构函数(例如,在
main()
函数返回后调用静态对象的析构函数)。如果在单例锁资源中分配的某些对象也是这样,那么这就成立了

因此,在大多数情况下,最好为此类对象实际编写析构函数,并使其有选择地释放内存


,他提出了这个问题,决定根本不写析构函数。然而,我想多说一点,这不是最好的解决方案

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

相反,你应该遵守普通的编码标准,这些标准规定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!
}

<>但是析构函数最好持久化。

< p>在程序终止时,C++语言不能保证内存回收,但任何半正版OS都会在没有问题的情况下完成。 所以,是的,如果

  • 您运行的是一个相当不错的操作系统
  • 析构函数除了释放内存外,不应该做任何其他事情
然后是的,你可以省略析构函数,泄漏内存,然后依靠操作系统来清理

这样做的明显缺点是,各种调试工具可能会对内存泄漏大喊大叫

当然,一个更基本的问题是,为什么要创建一个分配那么多内存的单例呢


对我来说,这听起来像是一个糟糕的设计。

实现析构函数,因为它是正确的方法,并且将是最可维护的版本。然后测量(创建一个只创建单例并退出的可执行文件)释放内存所需的实时时间

在您了解正确删除的成本后,不要编写错误的代码。如果需要一些可测量的时间,就把它视为相对于程序运行的时间的相对度量。在大多数情况下,应用程序所需的处理将远远超过释放内存所需的时间

如果你仍然认为它占用了太多的时间,考虑一个普通用户会考虑太多的时间,这个应用程序被用户打开和关闭了多少次,如果它真的有或没有。 如果最终您认为它太多了,那么您的风险是,在以后的某个时间,应用程序将被修改,单例程序可能会获取外部资源而不能释放它们——这对于文件锁来说尤其糟糕


那些为了性能而牺牲正确性的人不应该得到任何一个

技术上所有操作系统都应该得到的,但我要指出的是,windows是我在使用很长时间以来看到的最有缺陷的内存管理器。我见过它在这样的任务中失败,尽管在较新的windows版本中没有那么糟糕。也许你可以用一些事实来支持这种说法?请举例说明Windows(2000及以上的任何版本)无法回收内存的情况。否则你只是在传播你自己的无知。如果SSS信仰上帝,为什么不呢?;-)我当然不是说这行不通——只是想救他,或者那些将要维护应用程序的人,你是对的:a)析构函数需要很长时间才能删除所有层次结构b)它是一个单线程,不承担任何最终确定任何资源的责任,因此我决定不编写任何析构函数,以便在关闭应用程序时获得更好的使用体验:)亲爱的Pavel,我尊重你的想法,我同意这看起来很奇怪。我已经在遵循“不释放内存的意图必须是明确的”的想法,而且我也会对内存泄漏感到警惕。但我在2GhZ的cpu上看到了大约300毫秒的提升,而在有氙气处理的主机上则会少一些