пытаясь отследить утечку памяти, используя открытые CV и SDL - PullRequest
1 голос
/ 29 сентября 2011

Основной цикл программы ниже, где у меня возникают проблемы с обнаружением утечки памяти.Я запускаю Top и каждый раз, когда делаю снимок и печатаю его, я теряю память, которая никогда не восстанавливается даже при выходе.Я запустил valgrind, и некоторые результаты находятся внизу.Программа работает нормально, пока не закончится память.У меня, кажется, есть утечки с чашками и opencv, и утечка не пара сотен байт, это важно - я ценю любую помощь

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

32 780 байт в 1 блоках все еще доступны в записи потерь 180 из 182

в 0x4026864: malloc (vg_replace_malloc.c: 236)

от 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)

по 0x437A173: cupsGetResponse (в /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)

1 440 020 байт в 1 блоках могут быть потеряны в записи потерь 181 из 182

в 0x4026864: malloc (vg_replace_malloc.c:236)

по 0x415D0EB: cv :: fastMalloc (без знака int) (в /usr/local/lib/libopencv_core.so.2.3.1)

по 0x4A5DE36: (ниже основного) (libc-start.c: 226) --- DrawImage - единственное, что находится ниже основного

67 108 864 байт в 4 блоках, возможно, потеряно в записи потерь 182 из 182

в 0x4026864: malloc (vg_replace_malloc.c: 236)

от 0x473C057: _capture_V4L2 (CvCaptureCAM_V4L *, char *) (в /usr/local/lib/libopencv_highgui.so.2.3.1)

1 Ответ

1 голос
/ 29 сентября 2011

Ну, как минимум, вы никогда не звоните SDL_FreeSurface() на atr.

...