当动态创建的单例对象应该被删除时

When the dynamically created singleton object should be deleted?

本文关键字:删除 对象 动态 创建 单例      更新时间:2023-10-16

何时应该删除动态创建的单例对象?它真的需要删除对象显式(从析构函数)或未删除的内存将被OS/系统安全声明一旦程序退出?如果不删除会有什么后果?

通常建议在应用程序退出时销毁该对象。正如在注释中提到的,大多数操作系统会在应用程序终止时释放内存,但是如果你需要清理,例如在单例的析构函数中,那么你需要自己清理它(操作系统清理不会调用析构函数)。

我通常在应用程序退出之前删除它,但这并不总是最好的解决方案。我发现在某些情况下,创建单例只是为了删除,或者在删除后访问并重新创建。

您可以使用atexit()函数在创建单例时注册一个清理函数。例如:

static Singleton* s_instance = nullptr;
void cleanupSingleton() { 
     delete s_instance;
}

class Singleton {
public: 
    static Singleton* instance() { 
        if(s_instance == nullptr) {
            s_instance = new Singleton();
            std::atexit(cleanupSingleton);
        }
        return s_instance;
     }
 };

PS:不是最好的,线程安全的单例示例,但对于示例来说已经足够好了。

有关atexit()函数的更多信息,请参阅:Cplusplus.com或cppreference.com

如果使用单例,请使用Meyers的单例:

class Singleton {
public: 
    static Singleton& instance() { 
        static Singleton s_instance;
        return s_instance;
     }
    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;
private:
    Singleton() = default;
    ~Singleton() { /* Your clean up code */ }
 };

在main结束后自动调用析构函数