C++释放静态变量

jbu*_*jbu 25 c++ memory free static destructor

我希望我的类有一个静态指针指向动态分配的内存区域.我理解如何初始化它 - 在我的情况下,我将在第一个对象需要它时初始化它.但是,我不知道在代码中何时/何处释放它.我想在程序终止时释放它.

我可能能够在我的对象的析构函数中释放指针,但是我必须维护一个对象计数,以查看当对象是最后使用的对象时是否可以安全释放.

有没有更优雅的方式来做到这一点?

请告诉我.

谢谢,jbu

Kla*_*aim 19

你有两个解决方案:

  1. 不要删除删除它(你使用的是C++,你使用new和delete,对吧?;)).今天几乎所有操作系统都会在应用程序完成后"释放"应用程序分配的内存.但这不是一个好的解决方案,例如,使内存泄漏难以检测.
  2. 将指针封装到类(作为成员)中,然后使用此类作为静态类型.这样,您就知道将在应用程序结束时调用类析构函数.然后,您只需在析构函数中删除数据,即可完成工作并清理.这就是RAII的力量.

我建议你做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)

当程序结束时,静态变量(不再是指针)将被销毁,并且将调用它的析构函数来执行该操作.

它只是为了让您了解如何做到这一点.

  • RAII是一个不幸的术语,因为它不是很具描述性; 见http://en.wikipedia.org/wiki/RAII (4认同)

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)

哪个会产生同样的效果.你已经提到的另一个选择是保持静态计数器.请注意,您实际上可以非常有效地包装它.


Joh*_*ler 7

从操作系统的角度来看,在程序终止时释放内存没有任何意义,所有这一切都是缓慢终止.您的应用程序终止眼泪就下来了你的整个地址空间,它将释放一切你在堆上分配的一次.显式调用freeapp shutdown只是在堆中移动指针,无论如何都会丢弃.

我们如此努力地明确释放所有内容的主要原因是确保我们不会泄漏内存并且我们的内存占用不会永远增长.

但是,如果您可以确定这是静态的,那将只有一个,并且在您释放所有其他对象之前无法安全地释放它,这是一个允许应用程序更好的情况终止为你照顾它.

  • @jbu:如果那样做的话,那将不是一个很好的操作系统。;) (2认同)
  • 虽然这会使用一些内存泄漏检测工具掩盖其他内存泄漏,所以无论如何都不会推荐它. (2认同)
  • 在关机之前释放内存仍然有一个好处 - 它使真正的内存泄漏更容易找到.如果您使用工具来跟踪分配,那么您不删除的任何内容都将是您必须通过的噪音. (2认同)