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)
是否有更好的替代方法来制作一个方法来删除静态的东西,并在应用程序终止时调用它?
或者我可以说:"哦,无论如何,应用程序终止.操作系统将释放内存......"?
谢谢
简单.不要使静态成员成为指针.
然后它将被正确构造和破坏.
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)