C++:破坏静态东西的最佳方法

Mar*_*aux 5 c++ static destructor

当我有一个包含静态内容的类时,如何在应用程序结束时以最佳方式释放内存?

foo.h中

class GLUtesselator;

class Foo
{
private:
    static GLUtesselator *tess;
public:
    Foo();
    virtual ~Foo();
}
Run Code Online (Sandbox Code Playgroud)

Foo.cpp中

#include "Foo.h"

#include <GL/glu.h>

GLUtesselator *Foo::tess = gluNewTess(); // System call

Foo::Foo() {}
Foo::~Foo()
{
     // And of course I don't want to destruct it here,
     // because I'm going to use the tesselator in other instances of Foo
     // Otherwise:
     // gluDeleteTess(tess);
}
Run Code Online (Sandbox Code Playgroud)

是否有更好的替代方法来制作一个方法来删除静态的东西,并在应用程序终止时调用它?
或者我可以说:"哦,无论如何,应用程序终止.操作系统将释放内存......"?

谢谢

Mar*_*ork 7

简单.不要使静态成员成为指针.
然后它将被正确构造和破坏.

foo.h中

#include <GL/glu.h>

class Foo
{
    private:
        static GLUtesselator  tess;
    public:
                 Foo();
        virtual ~Foo();
};
Run Code Online (Sandbox Code Playgroud)

Foo.cpp中

// 
GLUtesselator  Foo::tess;
Run Code Online (Sandbox Code Playgroud)

如果你必须使用gluNewTess()和gluDeleteTess(),那么你可以使用共享指针.我没有编译器,所以确切的用法可能不是绝对正确的.但是shared_ptr确实具有这种能力.

foo.h中

#include <GL/glu.h>

typedef std::shared_ptr<GLUtesselator,void (*)(GLUtesselator*)> AutoGluTess;
class Foo
{
    private:
        static AutoGluTess  tess;
    public:
                 Foo();
        virtual ~Foo();
};
Run Code Online (Sandbox Code Playgroud)

Foo.cpp中

// 
AutoGluTess    Foo::tess(gluNewTess(), &gluDeleteTess);
Run Code Online (Sandbox Code Playgroud)