考虑到以下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();
}
};
答案 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];
//...
};