2013-11-22 165 views
2

所以當我運行這個應用程序時,每一件事情都會流暢運行,但它越走越慢。我查看了它正在使用的內存,當它達到400 mb時,它完全停止30秒,然後回落到200.SDL2內存泄漏C++

我對SDL2很新穎,我認爲這是因爲我調用的每個幀:

optionsTS = TTF_RenderText_Blended(font, "Options.", blanc); 
optionsT = SDL_CreateTextureFromSurface(renderer, optionsTS); 

例如,我有很多。

問題是我不知道如何正確刪除每個對象的對象,因爲如果我做了SDL_FreeSurface,我得到一個錯誤。

我不會發布我的整個代碼,因爲它是一團糟,但如果你想要它,隨時問。

你知道如何解決這個問題嗎?

+1

嗨,我會從每個框架中刪除optionsTS和optionsT,並將其作爲變量傳遞,這樣它只會創建一次,而不是每個框架。然後,這將允許您在每個需要它的框架中將它作爲參數傳遞。通常,在渲染循環中嘗試而不是創建任何對象,往往會快速變得龐大而混亂。 – GMasucci

+0

好的謝謝,我會看看是否有幫助 – user2826636

+0

謝謝!有效!!! – user2826636

回答

2

只是想我會把我的評論變成一個答案。

在你的代碼調用

optionsTS = TTF_RenderText_Blended(font, "Options.", blanc); 
optionsT = SDL_CreateTextureFromSurface(renderer, optionsTS); 

每一幀,我懷疑如果你從那裏刪除它們,初始化它們outwith渲染循環的,只是在它們作爲參數傳遞,你應該丟失的內存泄漏:原因是您將只創建一個內存中的每個實例,然後您可以根據需要重複使用它們。再看一遍,我懷疑你一旦做出optionT就可以銷燬optionTS,這樣你就可以節省更多的內存。 (未測試,因爲我的主機剛剛在本週末墜毀,而且我仍在重新安裝驅動程序和VS2010)

作爲一般規則,嘗試在渲染循環中不創建/銷燬任何對象,趨向於變大並且凌亂得很快。

0

如果可能,請考慮利用C++中的RAII。 例如,創建一個包裝SDL_Surface的類並在析構函數中調用SDL_FreeSurface。

class MySurface 
{ 
public: 
    MySurface(SDL_Surface & surface) : m_surface(surface) {} 
    ~MySurface() {SDL_FreeSurface(m_surface);} 

    SDL_Surface & GetSDLSurface() {return m_surface;} 

private: 
    SDL_Surface & m_surface; 
}; 

這樣,你會每次你從SDL API搶下SDL_Surface時間創建MySurface的一個實例,你將不必擔心何時或是否以釋放表面。只要MySurface的實例超出範圍,表面就會被釋放。

我確定更好的實現可以根據您的需求編寫和定製,但至少類似於這樣的東西可能會阻止您在將來發生泄漏。