繁体   English   中英

当一个类的所有实例被破坏时释放内存

[英]freeing memory when all instances of a class are destroyed

我有一个字体类,它将使用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;
        }
    }
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM