我有一個字體類,它將使用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;
}
}
}
當程序終止時,所有內存都被釋放。 – Barmar
是不是不好的編碼標準不釋放它呢? – Chemistpp
你問是否有辦法等到程序終止,而不是如果這是一個好主意。 :) – Barmar