2011-09-29 99 views
1

下面的程序主循環是我遇到找到內存泄漏問題的地方。我運行Top,每次通過拍攝照片並打印時,我都會失去即使退出時也無法恢復的記憶。我運行了valgrind,一些結果在底部。程序運行良好,直到內存不足。我似乎有杯和OpenCV泄漏,泄漏不是幾百個字節是顯著 - 我直接感謝所有幫助嘗試使用打開的CV和SDL追蹤內存泄漏

的Ubuntu 11.04的OpenCV 2.3.1

void DrawImage(SDL_Surface *srcimg, int sx, int sy, int sw, int sh, SDL_Surface *dstimg, int dx, int dy, int alpha) { 
    if ((!srcimg) || (alpha == 0)) return; //If theres no image, or its 100% transparent. 
    SDL_Rect src, dst; 
    src.x = sx; src.y = sy; src.w = sw; src.h = sh; 
    dst.x = dx; dst.y = dy; dst.w = src.w; dst.h = src.h; 
    SDL_BlitSurface(srcimg, &src, dstimg, &dst); 
} 


// ************************ Start of Main Loop ************************ 

while(Leave == 0) 
{ 

if(Start != 0) 
{ 
    atr = IMG_Load("pic1.jpg"); 
    DrawImage(atr, 0,0,DSP_WIDTH,DSP_HEIGHT,screen, 0, 0, 255); 
    SDL_Flip(screen); 

    CvCapture *camera = cvCreateCameraCapture(-1); 
    IplImage *frame2; 

    SDL_Surface* surface = NULL; 

    cvSetCaptureProperty(camera, CV_CAP_PROP_FRAME_HEIGHT, IMG_HEIGHT); 
    cvSetCaptureProperty(camera, CV_CAP_PROP_FRAME_WIDTH, IMG_WIDTH); 

    surface = IMG_Load("background.jpg"); 

    Seconds = 15; 
    while(Seconds !=0) 
    { 
     frame2 = cvQueryFrame(camera); 
     if(!frame2)continue; //Couldn't get an image, try again next time. 

     SDL_Surface* surface2 = NULL; 

     surface2 = SDL_CreateRGBSurfaceFrom((void*)frame2->imageData, 
       frame2->width, 
       frame2->height, 
       frame2->depth*frame2->nChannels, 
       frame2->widthStep, 
       0xff0000, 0x00ff00, 0x0000ff, 0); 

     SDL_BlitSurface(surface2, NULL, surface, &offsetpic); 

     SDL_FreeSurface(surface2); 

     DrawImage(surface, 0,0,DSP_WIDTH,DSP_HEIGHT,screen, 0, 0, 255); 
     SDL_Flip(screen); 

    } 

    if(!cvSaveImage("lastprint.jpg",frame2,0)) printf("Could not save: lastprint.jpg"); 

    cvReleaseImage(&frame2); 
    cvReleaseCapture(&camera); //Release the camera capture structure. 
    SDL_FreeSurface(surface); 

    cupsPrintFile(dest->name, "lastprint.jpg", "JOB1", dest->num_options, dest->options); 
    if(Start !=0) Start--;    // Dec Start 

//  atr = IMG_Load("pic1.jpg"); 
    DrawImage(atr, 0,0,DSP_WIDTH,DSP_HEIGHT,screen, 0, 0, 255); 
    SDL_Flip(screen); 

    } 
} 

許多之一下面這裏vvvvv

32780在1塊字節仍然損失記錄在可達的0x4026864 182

180:malloc的(vg_replace_malloc.c:236)

by 0x4365BA7:??? (在/usr/lib/libcups.so.2)

通過0x436731E:ippReadIO(在/usr/lib/libcups.so.2)

通過0x436785C:ippReadIO(在/ usr/LIB/libcups .so.2)

通過0x436785C:ippReadIO(在/usr/lib/libcups.so.2)

通過0x4367E85:ippRead(在/usr/lib/libcups.so.2)

by 0x437A173:cupsGetResponse(in /usr/lib/libcups.so.2)

通過0x437A501:cupsDoIORequest(在/usr/lib/libcups.so.2)

通過0x437A6FA:cupsDoRequest(在/usr/lib/libcups.so.2)

通過0x4358386:??? (在/usr/lib/libcups.so.2)

通過0x4359D52:cupsGetDests2(在/usr/lib/libcups.so.2)

通過0x435A1B4:cupsGetDests(在/ usr/LIB/libcups .so.2)

1440020在1塊字節都可能丟失在損失記錄在0x4026864 182

181:malloc的(vg_replace_malloc.c:236)

通過0x415D0EB:CV :: fastMalloc(unsigned int)(在/ usr/local/lib/libopencv_cor中e.so.2.3.1)

由0x4A5DE36:(下面主要)(的libc-start.c:226)---的DrawImage低於主

67108864字節在4個塊的唯一事情是可能迷失在負的戰績在0x4026864的182

182:的malloc(vg_replace_malloc.c:236)

通過0x473C057:_capture_V4L2(CvCaptureCAM_V4L *,字符*)(在/usr/local/lib/libopencv_highgui.so 2.3。1)

回答

1

那麼,至少你永遠不要在atr上撥打SDL_FreeSurface()

+0

感謝您的幫助 - 我退出時會打電話給您,但是您的意思是我需要在每次使用IMG_load之前釋放表面嗎?這只是主循環,還有一個叫出它。我需要釋放它併爲每個負載重新定義它。這是你的建議嗎? – goodgulf

+0

我說'IMG_Load()'分配了一個'SDL_Surface',並且當你完成它的時候,你需要'SDL_FreeSurface()'。 – genpfault

+0

好的,我不應該對IMG_Loads做同樣的變量。我應該加載到一個臨時變量,然後將其複製到那裏並釋放臨時表面 - 您說我會爲每個IMG_Load調用一個新的表面。當我用IMG_Load調用相同的變量時,我失去了釋放前一個變量的能力,那肯定會是一個泄漏。 – goodgulf