释放单例类的属性内存



考虑到下面的Singleton类,我没有在析构函数中释放内存。但是这个类的实例将保持程序的生命周期,就像大多数单吨类一样。释放属性的内存而不是最佳实践感知真的很重要吗?

class Singleton
{
private:
    Singleton() { pbyte1 = new BYTE[100]; }
    ~Singleton() {};
    BYTE* pbyte1;
    static SingletonInstance* pInstance;
    public:
    static Singleton* GetInstance()
    {
        if( pInstace ) return pInstance; 
        else 
        pInstance = new Singleton();
    }
};

这对调试很重要。如果您运行一个检测内存泄漏的工具,这个单例模式导致的泄漏将污染输出,使检测真正的内存泄漏变得更加困难。

这取决于资源的性质。通常是最佳实践is not销毁单例;破坏单例可以给出上升到析构函数问题的顺序。例外是如果是单例使用系统不会释放的资源(例如临时资源)文件);在这种情况下,instance()的"经典"实现功能:

Singleton& Singleton::instance()
{
    static Singleton theOneAndOnly;
    return theOneAndOnly;
}

在这种情况下,theOneAndOnly的析构函数将在关闭。出于这个原因,您必须确保单例永远不会用于静态变量的析构函数。

顺便说一下,你的实现也坏了。应该是:
Singleton& Singleton::instance()
{
    static Singleton* theOneAndOnly = new Singleton;
    return *theOneAndOnly;
}

正如Björn所说:这对调试很重要。

这对维护也很重要。计划将会改变。它将被重构。如果在重构过程中,一个单例突然不再是单例,丢失的析构函数可能会带来真正的泄漏。此外,在未来,对象可能需要更多的内存(例如db句柄)。在关闭程序时不返回它们是一个真正的错误。

所以如果你想要一个最佳实践:每个析构函数应该返回对象拥有的资源。这包括对象的析构函数,您可以依赖操作系统在程序关闭时接收它们。

如果单例实例在生命周期内仍然存在,则无需担心释放class资源。当程序终止时,它们将消失(我不是指自动delete)。

最佳实践是在固定大小时将类对象声明为自动的。

class SingleTon
{
//...
  BYTE pbyte1[100];
//...
};

最新更新