C ++释放静态变量

时间:2010-03-11 23:26:28

标签: c++ memory static free destructor

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

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

有更优雅的方法吗?

请告诉我。

谢谢, JBU

6 个答案:

答案 0 :(得分:19)

这里有两个解决方案:

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


    这是一个简单的例子。而不是这样做

    static Thing* things = new Thing(); // or whatever way to initialize, here or in a specific function
    

    你会这样做:

    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;
    };
    

    然后

    static ManagedThing thing; // now i can access it via thing.instance() 
    

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

    这篇文章只是为了让您了解如何做到这一点。

答案 1 :(得分:16)

将它扔进智能指针。它将具有静态生命周期并在main返回后被销毁:

static std::auto_ptr<T> thePointer;

另一种选择是注册您自己的atexit功能:

// static
void YourClass::freePointer(void)
{
    delete getPointer();
}

// static
T* YourClass::getPointer(void)
{
    if (!thePointer)
    {
        thePointer = new T;
        atexit(freePointer);
    }

    return thePointer;
}

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

答案 2 :(得分:7)

从操作系统的角度来看,在程序终止时释放内存没有任何意义,所有这一切都是缓慢终止。终止您的应用程序会破坏整个地址空间,它会立即释放您在堆上分配的所有。在app关闭时显式调用free只是在堆中移动指针,无论如何都会丢弃。

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

但是,如果你可以确定这是静态的,那将只有一个,并且你不能安全地释放它,直到所有其他对象都被释放,这是一个可能更好的情况让应用程序终止为您处理。

答案 3 :(得分:2)

您可以将静态变量声明为智能指针,然后当程序完成时,将释放分配的指针。

答案 4 :(得分:0)

我会在类中定义一个静态计数器来跟踪对象实例计数 当析构函数得到执行时,它递减计数器,如果counter == 0也释放内存..正如你

答案 5 :(得分:0)

当我试图让我自己的静态指针在退出时被释放时,我刚刚看到了这篇旧帖子。

正确的 C++ (C++11) 解决方案是使用智能指针,或者 std::unique_ptr<T>std::shared_ptr<T> 其中 T 是您正在初始化的对象的类型。这些模板管理对象的生命周期,并在对象超出范围或成为内存中的最后一个引用时分别删除对象。