c++ - 当一个类的所有实例都被销毁时释放内存

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

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

当继承了 KText 的新项目尝试打开字体时,我扫描 vector 以查找打开的字形,然后返回一个指向打开的字形的指针,并为该文本的所有实例使用已经创建的纹理(大小/名称/颜色)。

代码是

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 实例。

关于c++ - 当一个类的所有实例都被销毁时释放内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17540382/

相关文章:

c++ - 为什么 std::max 不适用于字符串文字?

c++ - C- 不兼容的指针类型用“int”类型的表达式初始化 'int *'

java - 需要帮助减少 Eclipse 和 tomcat 内存使用

memory-management - Swift程序中有必要使用autoreleasepool吗?

android - 在android中用指针绘制图表

c++ - 内存碎片分析器

c++ - 指向不完整类型成员函数的指针

c++ - 对列表进行更改时,std::string 和 std::list 的 boost::unordered_map 中的线程安全

c++ - MFC 列表框中的复选框在 VS2015 中显示不同

c# - 从 C# 调用 C dll 中的函数,它返回某种指向函数指针的指针