gpt4 book ai didi

c++ - 静态变量和 new() 之间的单例

转载 作者:太空宇宙 更新时间:2023-11-04 14:14:17 26 4
gpt4 key购买 nike

我知道 2 种方法来制作这样的单例模式:

class sgt_static
{
sgt_static() { }
public:
static sgt_static* get_instance()
{
static sgt_static instance;
return &instance;
}
}

还有这个:

class sgt_new
{
sgt_new() { }
public:
static sgt_new* get_instance()
{
static sgt_new* instance = NULL;
if ( instance == NULL ) instance = new sgt_new();
return instance;
}
}

我知道它们之间的一些区别:

  1. sgt_new 的实例应该由我自己删除。
  2. 如果程序退出(通常),sgt_static 的实例将被程序本身(或操作系统?)删除。

但是我在~sgt_new()中设置了断点,当我的程序退出时,调试器根本没有任何中断 Action 。有人说操作系统会回收这些资源。真的吗 ?那么,sgt_new 的实例不会导致任何内存泄漏吗?

除了我列表上面的几点。 2 单例实现之间还有其他区别吗?

最佳答案

堆上的对象不会被 C++ 系统删除,除非调用 delete。也就是说,第二个版本中的对象不会被销毁。根据对象的使用方式,这可能是有意为之的:虽然用函数包装对象可以保证对象在构造之前不会被访问,但可以做的是在它被销毁后访问它。毕竟,指针传递到哪里是无法控制的。

当程序终止时,无论读取什么,资源都会从程序外部回收。何时以及如何完成此操作取决于操作系统,并且可能会在不同时间回收不同的资源。请注意,此资源清理不会调用析构函数,而只是使文件描述符(或等效项)、内存、锁等资源可用。也就是说,如果您的单例的析构函数有任何重要的对象,您可能希望使用第一种方法。

也就是说,单例被大量过度用作某种被怀疑美化的全局内存!这是单例的一些合法用途,但概率表明 你的情况不是其中之一:根据我的运行计数,只有不到 1% 的单例使用是合法的。确定是否是单例的方法是确定是否可以想象在同一个可执行文件中运行的程序的两个(或更多)版本是否仍然可以使用同一个单例。如果不是,则它不是单例的合法使用。

关于c++ - 静态变量和 new() 之间的单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12545495/

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