2013-03-01 98 views
0

我不認爲這需要另一個問題,所以我編輯這個極其相關的一個。內存泄漏與班級成員

我有一個代碼可以通過從char *轉換爲wchar_t *來繪製文本,並且我懷疑存在內存錯誤,因爲程序內存會以瘋狂的速度上升(5,000 K到1,500,000分鐘)。

我懷疑mbstowcs(),但我想我現在已經發現了這個問題。

我正在使用一種比較糟糕的方式讓顏色繪製一般東西。

class MainClass { 
    public: 
     ID2D1SolidColorBrush* custom_color; 
     ID2D1SolidColorBrush get_rgba(float r, float g, float b, float a) { 
      // render is a validated ID2D1RenderTarget* 
      render->CreateSolidColorBrush(D2D1::ColorF(r,g,b,a),&custom_color); 
      return custom_color; 
     } 
}; 

內存使用增加幾乎肯定來自此函數。 有沒有更好的方法可以返回像這樣的自定義顏色?

+0

valgrind --leak-check = full。/ program'的輸出是什麼? – PSIAlt 2013-03-01 07:33:33

+0

這是在VS2012上運行,我對調試器參數不太熟悉,甚至沒有控制檯。 – object 2013-03-01 07:38:23

回答

0

我的問題是,它返回一個ID2D1SolidColorBrush代碼*替換原爲可變色,這是執行一個Create()而不是每次調用它時都會釋放,所以刷子會累積起來並變成內存泄漏。

1

您看起來確實沒有內存泄漏。內存泄漏工具報告的許多「泄漏」有時是誤報。但是,有一個簡單的解決方法可以將nxtx排除爲可能的泄漏。既然你分配一個固定的量(250個字)每一次,你可以很容易地分配這一關棧:

const int MY_MAX_STRING_SIZE = 1000; 
    wchar_t ntxt[MY_MAX_STRING_SIZE]; // simple stack allocation 
    mbstowcs(ntxt,text.c_str(),MY_MAX_STRING_SIZE); 
    ntxt[MY_MAX_STRING_SIZE-1] = 0; //insure null termination 
    render->DrawTextA(ntxt,text.length(),font,trect,color); 
} 

一件事我注意到的是,你的mbstowc調用指定「大小」作爲一個字符的最大數量複製,但硬編碼250作爲長度。你確定你確定「大小」總是小於250嗎?

+0

當我說內存泄漏時,我可能會想到錯誤的單詞。如果我在任務管理器中觀察程序內存使用情況,由於此代碼每秒執行至少50-60次,內存使用量將在大約5分鐘內接近1,500,000 K.當我註釋掉執行該函數的行時,內存不會增加。 – object 2013-03-01 07:25:14

+0

任務管理器不是內存泄漏檢測工具。這是非常不準確的 - 尤其是因爲CRT通常會緩存來自系統的分配以便稍後快速重新分配。但是,如果您在任務管理器中看到您的程序穩步增加內存使用量,則可能在某處發生泄漏。 – selbie 2013-03-01 07:26:37

+0

是的;起初我不知道泄漏的位置,但經過一些評論後,特別是它被縮小到這個功能。 – object 2013-03-01 07:29:28

0

它沒有看起來像你有內存泄漏。但是可能會有危險的情況發生:mbstowcs在dest中接受的最大長度爲wchar_t,但是給出字符串長度。修正了這一點:

int size=text.length()+1; 
    enum { NTXT_LEN = 250 }; 
    wchar_t* ntxt= new wchar_t[NTXT_LEN]; 
    mbstowcs(ntxt, text.c_str(), NTXT_LEN); 

而且,這是值得的東西,如scoped_array

+0

嘗試這可能確實使它更安全,但程序的內存使用率仍然以劇烈的速度上升。 – object 2013-03-01 07:30:41