当一个类的所有实例都被销毁时释放内存
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
实例。
相关文章:
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 常量类实例的C++内存地址
- 是否应该使用继承来减少内存消耗的实例的内存分配?
- 在C++中,为什么仅包含与其基类实例的联合的派生类占用的内存多于联合的大小?
- 在函数中实例化的 STL 对象正在占用堆栈或堆上的内存?
- 将内存文件添加到 clang 编译器实例
- 在结构中使用位字段并使用C++从内存中读取实例
- 如何将内存分配给具有数组成员的类的实例
- std::array 模板实例会占用更多的代码内存吗?
- 插入std :: basic_ostream实例化输出时的内存故障
- 构造函数C++中的类实例内存地址
- 基本指针如何能够在派生的类实例中了解基本成员的内存位置
- 有没有办法区分对象实例使用的内存类型
- 如果我声明一个没有名称的类实例,它会保留在内存中吗?
- 当我创建一个int指针并实例化一个数组时,数组在内存中发生了什么
- 派生类的实例化是否为基类的私有成员分配内存
- 分配给 cpp 中定义的全局静态变量的内存是否在 C++ 中删除其类的实例后释放
- 从用户控制的内存池中分配和实例化对象
- C++中参数列表中实例化对象的内存管理
- 重载运算符 std::ostream& 运算符<<打印实例内存地址