Утечка памяти SDL - PullRequest
       87

Утечка памяти SDL

0 голосов
/ 01 июля 2018

Итак, я попытался сделать что-то на SDL, но в первой программе у меня есть память, обнаруженная (утечка идентификатора или нет), поэтому есть код:

#include <stdio.h>
#include <SDL.h>
#include <SDL_image.h>
#include <SDL_ttf.h>
#define SCREENSIZEX 180
#define SCREENSIZEY 300
SDL_Window* mainwind = NULL;
SDL_Renderer* rend = NULL;
TTF_Font* Usefont = NULL;

int main(int argc, char* argv[])
{
    SDL_Init(SDL_INIT_EVERYTHING);
    Uint32 windowflags;
    windowflags = SDL_WINDOW_SHOWN;
    mainwind = SDL_CreateWindow("FooBar", 
                                SDL_WINDOWPOS_CENTERED, 
                                SDL_WINDOWPOS_CENTERED, 
                                SCREENSIZEX, 
                                SCREENSIZEY, 
                                windowflags);
    rend = SDL_CreateRenderer(mainwind, -1, SDL_RENDERER_ACCELERATED);
    SDL_SetRenderDrawColor(rend, 255, 255, 255, 255);
    int imgFlags = IMG_INIT_PNG;
    IMG_Init(imgFlags);
    TTF_Init();
    Usefont = TTF_OpenFont("DOTMBold.TTF",90);

    SDL_Surface* TextSurf = NULL;
    SDL_Texture* TextTexture = NULL;

    SDL_Color UsingColor;
    UsingColor.r=0;
    UsingColor.g=255;
    UsingColor.b=255;
    UsingColor.a=100;

    bool exit = false;
    char Text[500];
    int counter = 0;
    SDL_Event evneet;
    while(!exit)
    {
        SDL_PollEvent(&evneet);
        SDL_RenderClear(rend);
        counter++;
        TextSurf = TTF_RenderUTF8_Blended(Usefont, Text, UsingColor);
        TextTexture = SDL_CreateTextureFromSurface(rend, TextSurf);
        SDL_FreeSurface(TextSurf);
        TextSurf = NULL;
        SDL_RenderCopy(rend, TextTexture, NULL, NULL);
        TextTexture = NULL;
        SDL_DestroyTexture(TextTexture);
        SDL_RenderPresent(rend);
    }
    SDL_FreeSurface(TextSurf);
    TextSurf = NULL;
    SDL_DestroyTexture(TextTexture);
    SDL_DestroyRenderer(rend);
    SDL_DestroyWindow(mainwind);
    SDL_Quit();
    return 0;   
}

Проблема: некоторые скриншоты

Я знаю, как это исправить, и пытался сделать много освобождения и манипуляций с памятью. Эта программа выполняет только одну задачу. Просто считая кадры (в коде отображается только 0) Это моя третья попытка сделать рендеринг, и я всегда получаю одно и то же. Пожалуйста, помогите!

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Ответ был странным. Благодаря Ctx, это первая часть этого большого беспорядка с изменяющимися поверхностями и текстами. Что касается меня, то большой ошибкой была NULLing текстура, когда мне нужно передать «nullptr».

SDL_FreeSurface(AlreadyDrawedAndUsedOnSurface);
AlreadyDrawedAndUsedOnSurface = NULL;    //BAD!
AlreadyDrawedAndUsedOnSurface = nullptr; //good)

Очень странно для меня, но это работает!

0 голосов
/ 02 июля 2018

Это выглядит подозрительно:

while(!exit)
{
    ...
    TextTexture = SDL_CreateTextureFromSurface(rend, TextSurf);
    ...
    TextTexture = NULL;                // A
    SDL_DestroyTexture(TextTexture);   // B
    ...
}

SDL_DestroyTexture() не получает действительный дескриптор здесь, но NULL -Pointer передается. Вы должны поменять местами линии A и B, чтобы текстуру можно было правильно освободить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...