什么时候应该删除动态创建的单例对象?

时间:2016-08-23 03:00:04

标签: c++ memory design-patterns singleton free

何时应删除动态创建的单例对象?是否真的需要显式删除对象(来自析构函数),或者一旦程序退出,OS / System会安全地声明未删除的内存?如果不删除会有什么后果?

2 个答案:

答案 0 :(得分:1)

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

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

创建单例时,可以使用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.comcppreference.com

答案 1 :(得分:1)

如果您使用单身,请使用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 */ }
 };

析构函数将在主要结束后自动调用。