c++ - 单例析构函数

标签 c++ memory-management singleton

不使用实例/引用计数器的单例对象是否应被视为 C++ 中的内存泄漏?

如果没有计数器在计数为零时调用显式删除单例实例,那么如何删除对象?应用程序终止时是否由操作系统清理?如果那个 Singleton 在堆上分配了内存怎么办?

简而言之,我是否必须调用 Singelton 的析构函数,或者我是否可以依赖它在应用程序终止时对其进行清理?

最佳答案

通常,“这取决于”。在任何名副其实的操作系统中,当您的进程退出时,进程内本地使用的所有内存和其他资源都将被释放。你根本不需要担心这个。

但是,如果您的单例在其自己的进程之外分配生命周期的资源(可能是文件、命名互斥体或类似的东西),那么您确实需要考虑进行适当的清理。

RAII 将在这里为您提供帮助。如果你有这样的场景:

class Tempfile
{
Tempfile() {}; // creates a temporary file 
virtual ~Tempfile(); // close AND DELETE the temporary file 
};

Tempfile &singleton()
{
  static Tempfile t;
  return t;
}

...那么您可以放心,无论您的应用程序退出,您的临时文件都会被关闭并删除。 However, this is NOT thread-safe, and the order of object deletion may not be what you expect or require.

但是,如果你的单例是这样实现的

Tempfile &singleton()
{
  static Tempfile *t = NULL;
  if (t == NULL)
    t = new Tempfile(); 
  return *t;
}

...那你的情况就不同了。您的临时文件使用的内存将被回收,但不会删除该文件,因为不会调用析构函数。

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

相关文章:

c++ - 在架构 x86_64 clang : error: linker command failed with exit code 1 (use -v to see invocation) 中找不到符号

c++ - 将许多位转换为 Base 10

c++ - 在自定义堆栈分配器中释放内存

C++:重复的静态成员?

php - 如何在 PHP 中将守护进程变成流

c++ - 为什么我不能在 C++ 中用 new 调用参数化构造函数?

c++ - 如果我的 Visual C++ 自定义内存分配器返回未正确对齐的 block ,会发生什么情况?

c++ - 使用 placement new 了解 C++ 中的内存访问

java - 我们在 Spring 中使用 Prototype 范围的实际业务场景?

objective-c - 在 Objective-c 中的单例类上设置初始化可配置变量的好方法是什么?