Kla*_*aim 19
你有两个解决方案:
我建议你做2,这是一个非常干净的方法.
这是一个简单的例子.而不是这样做
static Thing* things = new Thing(); // or whatever way to initialize, here or in a specific function
Run Code Online (Sandbox Code Playgroud)
你会这样做:
class ThingManager // or whatever name you like
{
public:
ThingManager( Thing* thing ) : m_thing( thing ) { }//or create it here? whatever solution suits your way of creating the data
~ThingManager() { delete m_thing; } // THAT's the important part!
Thing* instance() const { return m_thing; } // or whatever accessor you need, if you need one
private:
Thing* m_thing;
};
Run Code Online (Sandbox Code Playgroud)
然后
static ManagedThing thing; // now i can access it via thing.instance()
Run Code Online (Sandbox Code Playgroud)
当程序结束时,静态变量(不再是指针)将被销毁,并且将调用它的析构函数来执行该操作.
它只是为了让您了解如何做到这一点.
GMa*_*ckG 16
把它扔进智能指针.它将具有静态生命周期并在main
返回后被销毁:
static std::auto_ptr<T> thePointer;
Run Code Online (Sandbox Code Playgroud)
另一个选择是注册自己的atexit
功能:
// static
void YourClass::freePointer(void)
{
delete getPointer();
}
// static
T* YourClass::getPointer(void)
{
if (!thePointer)
{
thePointer = new T;
atexit(freePointer);
}
return thePointer;
}
Run Code Online (Sandbox Code Playgroud)
哪个会产生同样的效果.你已经提到的另一个选择是保持静态计数器.请注意,您实际上可以非常有效地包装它.
从操作系统的角度来看,在程序终止时释放内存没有任何意义,所有这一切都是缓慢终止.您的应用程序终止眼泪就下来了你的整个地址空间,它将释放一切你在堆上分配的一次.显式调用free
app shutdown只是在堆中移动指针,无论如何都会丢弃.
我们如此努力地明确释放所有内容的主要原因是确保我们不会泄漏内存并且我们的内存占用不会永远增长.
但是,如果您可以确定这是静态的,那将只有一个,并且在您释放所有其他对象之前无法安全地释放它,这是一个允许应用程序更好的情况终止为你照顾它.