Почему valgrind сообщает, что моя память потеряла 12 или 24 байта, используя GLUT и PORTAUDIO - PullRequest
2 голосов
/ 13 марта 2020

Я написал код с portaudio и протестировал его с Valgrind. В результате я получил «0 байтов определенно потеряно». Но когда я смешал ее с библиотекой glut (freeglut) для включения графики, я получил «24 байта определенно потеряно».

В приведенном ниже коде я просто добавил glutCreateWindow( "OpenGL" ), а затем получил память утечка в отчете Valgrind. Я использую библиотеки glew, freeglut, portaudio, sndfile. Кто-нибудь знает, что здесь происходит?

#include "util.h"
#include "sound.h"
#include <unistd.h>

/*Funcion main para creacion de hilos de reproduccion*/
int main(int argc, char* args[]){
    sound::loadStream("../pacman.wav");// this function do Pa_Initiliaze()/Pa_OpenDefaultStream()/ 
                                       //Pa_StartStream()/
    sound::loadStream("../ya_te.wav");
     glutInit( &argc, args );
    //Create OpenGL 2.1 context
    glutInitContextVersion( 2, 1 );
    //Create Double Buffered and RGBA Window
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH );
    glutInitWindowSize( 1920, 1080 ); //size of window
    glutCreateWindow( "OpenGL" ); // leak memory start at this line
    sound::changeState(0,PLAY);  //this fucntion change pacman.wav state to PLAY in portaudio 
                                 //callback
    sound::changeState(1,PLAY); // this function change ya_te.wav state to PLAY in portaudio 
                                //callback
    sleep(1); // sleep for 1 second
    sound::soundTerminate(); // this function do Pa_closeStream , Pa_terminate();
    glutDestroyWindow(glutGetWindow());
    return 0;
}

1 Ответ

0 голосов
/ 13 марта 2020

Вы не «отслеживаете» окно, созданное в вашем вызове на glutCreateWindow, что означает, что (с точки зрения Вальгринда) вы никогда не сможете должным образом освободить память, используемую этим окном.

Вам следует сохранить возвращаемое значение вызова, например:

int winID = glutCreateWindow( "OpenGL" );

, а затем использовать сохраненный идентификатор окна при последующем вызове для его уничтожения:

glutDestroyWindow(winID);

ПРИМЕЧАНИЕ. Даже если ваше использование glutGetWindow() (скорее всего) вернет то же значение, Valgrind не знает (или не может) этого знать.

...