簡體   English   中英

SDL2內存泄漏C ++

[英]SDL2 Memory Leaks C++

因此,當我運行該應用程序時,總的來說,每件事都運行順利,但是它運行的越多,速度就越慢。 我查看了它正在使用的內存,當它達到400 mb時,它完全停止了30秒,然后又下降到200。

我對SDL2相當陌生,我認為這是因為我調用的每個幀:

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

例如,我有很多。

問題是我不知道如何正確刪除每一幀的對象,因為如果執行SDL_FreeSurface會出現錯誤。

我不會發布整個代碼,因為那是一團糟,但是如果您願意,可以隨時提出。

你知道怎么解決嗎?

只是以為我會將我的評論變成答案。

在您的代碼中調用

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

每幀,我懷疑如果從那里刪除它們,將它們從render循環中初始化出來,然后簡單地將它們作為參數傳遞進去,則應該會丟失內存泄漏:原因是您將只為每個幀創建一個內存中實例然后您可以根據需要重復使用它們。 再次查看時,我懷疑一旦制成optionT可以銷毀optionTS ,這樣可以節省更多的內存。 (尚未測試,因為我的主機本周末剛剛崩潰,並且我仍在重新安裝驅動程序和VS2010)

作為一般規則,請嘗試不要在渲染循環中創建/銷毀任何對象,否則它們會很快變得大而混亂。

如果可能,請考慮利用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實例超出范圍,該表面將被釋放。

我敢肯定,可以編寫出更好的實現,並根據您的需求進行量身定制,但至少類似的事情可能會阻止您將來的泄漏。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM