当类的所有实例都被销毁时释放内存

时间:2013-07-09 05:09:29

标签: c++ pointers memory-management memory-leaks destructor

我有一个字体类,它会使用sdl从.ttf加载字形到openGL纹理。该类由每个字形的单独纹理组成,并且显然会连续渲染它们以创建显示的文本。我认为将.ttf加载到sdl表面然后使用表面像素数据生成openGL纹理是很昂贵的。所以,对于我的程序,我有一个KText类,它有一个成员:static std::vector<Font*> OpenedFonts;

当一个继承了KText的新项目试图打开一个字体时,我会扫描该矢量以查找打开的字形,然后只返回一个指向打开的字形的指针,并只使用已经制作的纹理来处理该文本的所有实例(大小) /名/色)。

代码是

bool KText::LoadFont() {
    _Font = CheckOpenedFonts(); //_Font is KFont* pointer
    if(_Font == NULL) {
        _Font = new KFont;
        _Font->LoadFont();
    }
    if(_Font == NULL) return false;
    return true;
}

显然,我不是每次都会打开一个新字体,所以在我的析构函数中,我不想简单地使用delete _Font。因为这两个原因:还有另一个KText对象指向同一组字形,如果在创建另一个对象并尝试使用该字体的情况下程序终止,最好将它们保存在内存中。

有没有办法等到KFont的所有实例都离开范围?

谢谢!

解决方案是:

class KText {
private:
    static int TextCnt;
public:
    KText();
    ~KText();
};

//Implementation
static int KText::TextCnt = 0;
KText::KText() {
   TextCnt++;
}

KText::~KText() {
   TextCnt--;
   if(TextCnt < 1) {
       OpenedFonts* t = FntPnter; //FntPnter is a head pointer to the linked list of fonts
       while(t != NULL ) {
           FntPnter = t->Next;
           delete t;
           t = FntPnter;
        }
    }
}

1 个答案:

答案 0 :(得分:1)

您可以在KFont中创建一个静态整数成员,假设为static int KFontCnt;,这是KFont个对象的数量。然后在KFontCnt构造函数中增加KFont,在KFont析构函数中减少它。当它在析构函数中达到0时,您可以释放所有KFont个实例。