2013-07-09 31 views
1

我有一個字體類,它將使用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; 
     } 
    } 
} 
+2

當程序終止時,所有內存都被釋放。 – Barmar

+0

是不是不好的編碼標準不釋放它呢? – Chemistpp

+0

你問是否有辦法等到程序終止,而不是如果這是一個好主意。 :) – Barmar

回答

1

您可以創建在KFont靜態整數成員比方說static int KFontCnt;,這是KFont對象的數量。然後在KFont構造函數中增加KFontCnt,在KFont析構函數中減少它。當它在析構函數中達到0時,您可以釋放所有KFont實例。

+0

這是一箇舊帖子,我應該回來回答,但這正是我最終做的。 – Chemistpp

相關問題