下面的程序主循環是我遇到找到內存泄漏問題的地方。我運行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)
感謝您的幫助 - 我退出時會打電話給您,但是您的意思是我需要在每次使用IMG_load之前釋放表面嗎?這只是主循環,還有一個叫出它。我需要釋放它併爲每個負載重新定義它。這是你的建議嗎? – goodgulf
我說'IMG_Load()'分配了一個'SDL_Surface',並且當你完成它的時候,你需要'SDL_FreeSurface()'。 – genpfault
好的,我不應該對IMG_Loads做同樣的變量。我應該加載到一個臨時變量,然後將其複製到那裏並釋放臨時表面 - 您說我會爲每個IMG_Load調用一個新的表面。當我用IMG_Load調用相同的變量時,我失去了釋放前一個變量的能力,那肯定會是一個泄漏。 – goodgulf