考虑到下面的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];
//...
};