C++ C++;使用SDL_TTF时,程序内存使用量不断增加

C++ C++;使用SDL_TTF时,程序内存使用量不断增加,c++,xcode,memory-leaks,sdl-2,sdl-ttf,C++,Xcode,Memory Leaks,Sdl 2,Sdl Ttf,我正在使用SDL库编写一个简单游戏的代码。关于这一点,我有两个问题: 如果我不设置断点,让程序自己运行,内存使用率就会很高(与开始时相比大约是20-30倍)。但是,如果我停止循环(游戏的主循环)并自己单击,那么在单击大约100次之后,内存使用量保持不变(?)。为什么? 所以我决定用仪器来分析原因,因为我认为在循环中我可以添加新元素而不破坏它。每次我在Instrument中点击record时,应用程序都会持续5秒钟,然后会在出现崩溃报告时关闭(应用程序在xcode中运行良好,内存充足) 线程0崩溃

我正在使用SDL库编写一个简单游戏的代码。关于这一点,我有两个问题:

  • 如果我不设置断点,让程序自己运行,内存使用率就会很高(与开始时相比大约是20-30倍)。但是,如果我停止循环(游戏的主循环)并自己单击,那么在单击大约100次之后,内存使用量保持不变(?)。为什么?

  • 所以我决定用仪器来分析原因,因为我认为在循环中我可以添加新元素而不破坏它。每次我在Instrument中点击record时,应用程序都会持续5秒钟,然后会在出现崩溃报告时关闭(应用程序在xcode中运行良好,内存充足)

    线程0崩溃::调度队列:com.apple.main-Thread

    0 org.libsdl.SDL2 0x0000000100f5bea9 0x100ee9000+470697

    1 Spike 10 0x0000000100ea40cc imageTexture::render()+50(imageTexture.cpp:37)

    2 Spike 10 0x0000000100ea2b70 GUI::renderImage()+40(GUI.cpp:140)

    3 Spike 10 0x0000000100ea30b2 GUI::run()+1258(GUI.cpp:172)

    4尖峰10 0x0000000100ea439e干管+36(干管cpp:15)

    5 libdyld.dylib 0x00007fff8c60f5ad启动+1

  • 以下是一些我认为可能相关的代码:

    对于数字3://imageVector只是一个包含所有imageVector指针的向量

    SDL_RenderClear( gRenderer );
    for (int i = 0; i < imageVector.size(); i++) {
        imageVector[i]->render();
    }
    
    在长时间尝试禁用/启用代码以查找发生了什么之后,我仍然不知道出了什么问题

    这是我当前的循环:

    while (true) {
        textVector[0]->setInput(system->output());
        renderImage();
        renderText();
        SDL_RenderPresent( gRenderer );
    }
    
    它的一些代码:

    void textTexture::setInput(std::string newText) {
        gText = newText;
    }
    
    void GUI::renderImage() {
        SDL_RenderClear( gRenderer );
        for (int i = 0; i < imageVector.size(); i++) {
            imageVector[i]->render();
        }
    }
    
    void GUI::renderText() {
        for (int i = 0; i < textVector.size(); i++) {
            textVector[i]->render();
        }
    }
    
    void textTexture::render() {
        //set rendering space and render to screen
        SDL_Rect temp = {x, y, width, height};
    
        //recreate the texture
        createTextureFromRenderedText(gText);
    
        //render to the screen
        SDL_RenderCopy(gRenderer, texture, NULL, &temp);
    }
    
    void textTexture::createTextureFromRenderedText(std::string text) {
        if (text != "") {
            SDL_Surface* textSurface = TTF_RenderText_Blended_Wrapped(gFont, text.c_str(), textColor, 600);
    
            if( textSurface == NULL )
            {
                printf( "Unable to render text surface! SDL_ttf Error: %s\n", TTF_GetError() );
            }
            else
            {
                //Create texture from surface pixels
                texture = SDL_CreateTextureFromSurface( gRenderer, textSurface );
                if( texture == NULL )
                {
                    printf( "Unable to create texture from rendered text! SDL Error: %s\n", SDL_GetError() );
                }
                else
                {   
                    //Get image dimensions
                    width = textSurface->w;
                    height = textSurface->h;
                }
    
                //Get rid of old surface
                SDL_FreeSurface( textSurface );
            }
        }
    }
    
    void textTextTexture::setInput(std::string newText){
    gText=新文本;
    }
    void GUI::renderImage(){
    SDL_RenderClear(gRenderer);
    对于(int i=0;irender();
    }
    }
    void GUI::renderText(){
    对于(int i=0;irender();
    }
    }
    void textTexture::render(){
    //设置渲染空间并渲染到屏幕
    SDL_Rect temp={x,y,宽度,高度};
    //重新创建纹理
    createTextureFromRenderedText(gText);
    //渲染到屏幕上
    SDL_渲染副本(渲染器、纹理、空值和临时值);
    }
    void textTextTexture::createTextureFromRenderedText(标准::字符串文本){
    如果(文本!=“”){
    SDL_Surface*textSurface=TTF_RenderText_Blended_Wrapped(gFont,text.c_str(),textColor,600);
    if(textSurface==NULL)
    {
    printf(“无法呈现文本表面!SDL_ttf错误:%s\n”,ttf_GetError());
    }
    其他的
    {
    //从表面像素创建纹理
    纹理=SDL_CreateTextureFromSurface(gRenderer,textSurface);
    如果(纹理==NULL)
    {
    printf(“无法从渲染文本创建纹理!SDL错误:%s\n”,SDL_GetError());
    }
    其他的
    {   
    //获取图像尺寸
    宽度=文本表面->w;
    高度=文本表面->h;
    }
    //去除旧表面
    SDL_自由曲面(textSurface);
    }
    }
    }
    
    找到问题所在。我复制lazyfoo的风格并尝试在我的中实现,因此当我渲染新的TextTextTexture时,它实际上会创建新的纹理而不会破坏它。通过使用SDL_DestroyTexture,一切正常

    在这里找到了答案:

    看来不是XCode泄露了资源,而是你的程序?您应该编辑标题以反映这一点。@JoachimPileborg ok I will:)。谢谢:你需要提供更多的代码。。否则我们帮不了你。@BasvanStein我可以,但因为这是一个非常大的程序,所以我不知道从哪里开始:-?@TreeNguyen你能在GUI::renderImage()第140行和imageTexture::render()第37行发布代码吗。至少这两种方法都是如此。还有,纹理是从哪里来的?
    void textTexture::setInput(std::string newText) {
        gText = newText;
    }
    
    void GUI::renderImage() {
        SDL_RenderClear( gRenderer );
        for (int i = 0; i < imageVector.size(); i++) {
            imageVector[i]->render();
        }
    }
    
    void GUI::renderText() {
        for (int i = 0; i < textVector.size(); i++) {
            textVector[i]->render();
        }
    }
    
    void textTexture::render() {
        //set rendering space and render to screen
        SDL_Rect temp = {x, y, width, height};
    
        //recreate the texture
        createTextureFromRenderedText(gText);
    
        //render to the screen
        SDL_RenderCopy(gRenderer, texture, NULL, &temp);
    }
    
    void textTexture::createTextureFromRenderedText(std::string text) {
        if (text != "") {
            SDL_Surface* textSurface = TTF_RenderText_Blended_Wrapped(gFont, text.c_str(), textColor, 600);
    
            if( textSurface == NULL )
            {
                printf( "Unable to render text surface! SDL_ttf Error: %s\n", TTF_GetError() );
            }
            else
            {
                //Create texture from surface pixels
                texture = SDL_CreateTextureFromSurface( gRenderer, textSurface );
                if( texture == NULL )
                {
                    printf( "Unable to create texture from rendered text! SDL Error: %s\n", SDL_GetError() );
                }
                else
                {   
                    //Get image dimensions
                    width = textSurface->w;
                    height = textSurface->h;
                }
    
                //Get rid of old surface
                SDL_FreeSurface( textSurface );
            }
        }
    }