释放属性的单例类的内存

时间:2011-09-06 09:36:47

标签: c++ singleton

考虑到以下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();
    }
};

4 个答案:

答案 0 :(得分:3)

它对调试很重要。如果你运行一个检测内存泄漏的工具,那么这个单例引起的泄漏会污染输出,使得检测真正的内存泄漏变得更加困难。

答案 1 :(得分:2)

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

维护也很重要。该计划将改变。它将被重构。如果在重构过程中突然出现单例突然不再是单例,那么缺失的析构函数可能会引入真正的泄漏。此外,将来对象可能需要的不仅仅是内存(例如数据库句柄)。关闭程序时不返回它们是一个真正的错误。

因此,如果您需要最佳实践:每个析构函数都应该返回对象拥有的资源。这包括对象的析构函数,您可以依赖操作系统在程序关闭时执行它们。

答案 2 :(得分:2)

这取决于资源的性质。通常,最好的做法 是来破坏单身人士;破坏单身人士可以给予 上升到破坏者问题的顺序。例外是单身人士 使用系统不会释放的资源(例如临时资源) 文件);在这种情况下,instance()的“经典”实现 功能是:

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

在这种情况下,theOneAndOnly的析构函数将被调用 关掉。因此,您必须确保单身人士永远不会 用于静态变量的析构函数。

顺便说一下,你的实施也被打破了。它应该是:

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

这是通常的解决方案。

答案 3 :(得分:0)

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

最佳做法是在修复大小时将类对象声明为自动。

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