不使用实例/引用计数器的单例对象是否应被视为 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/