2014-01-07 1 views
1

Я вынимаю данные из промышленной камеры uEye и получаю изображения через API-интерфейс камеры.Освобождение данных от char * в C++

Мой код выглядит примерно так:

bool get_image(char*& img) 
{ 
    void *pMemVoid; //pointer to where the image is stored 

// Takes an image from the camera. If successful, returns true, otherwise 
// returns false 
    if (is_GetImageMem(hCam, &pMemVoid) == IS_SUCCESS){ 

     img = (char*) pMemVoid; 
     pMemVoid = NULL; 
     return true; 
    } 
    else 
     return false; 
} 

Я извлечение данных изображения, и если он успешен, он возвращает истину, в противном случае возвращает ложь.

Проблема Я полагаю, что я утечка памяти с помощью img = (char *) pMemVoid, потому что я неоднократно вызываю эту функцию и не отпускаю эти данные. Как освободить память, назначенную img?

EDIT:

Я инициализация камеры в функции, которая использует is_AllocImageMem:

// Global variables for camera functions 
HIDS hCam = 0; 
char* ppcImgMem; 
int pid; 

/* Initializes the uEye camera. If camera initialization is successful, it 
* returns true, otherwise returns false */ 
bool init_camera() 
{ 
    int nRet = is_InitCamera (&hCam, NULL); 

    is_AllocImageMem(hCam,752, 480, 1 ,&ppcImgMem, &pid); 
    is_SetImageMem(hCam, ppcImgMem, pid); 
    is_SetDisplayMode (hCam, IS_SET_DM_DIB); 
    is_SetColorMode (hCam, IS_CM_MONO8); 
    int pnCol , pnColMode; 
    is_GetColorDepth(hCam, &pnCol , &pnColMode); 

    is_CaptureVideo(hCam, IS_WAIT); 

    if (nRet != IS_SUCCESS) 
    { 
     if (nRet == IS_STARTER_FW_UPLOAD_NEEDED) 
     { 
     hCam = hCam | IS_ALLOW_STARTER_FW_UPLOAD; 
     nRet = is_InitCamera (&hCam, NULL); 
     } 
     cout << "camera failed to initialize " << endl; 
     return false; 
    } 
    else 
    return true; 
} 
+3

Документация для api должна сказать вам об этом. У них может быть своя специальная «свободная» функция. – BoBTFish

+0

На самом деле, глядя [здесь] (http://lagis-vi.univ-lille1.fr/~lo/ens/ivi/uEye_Programming_Manual/index.html?is_getimagemem.htm), кажется, вы получаете указатель на какую-то память, принадлежит/управляется в другом месте, хотя это не совсем понятно (может быть, это тот, кто понимает эту библиотеку). Поэтому я не думаю, что вам нужно что-то делать здесь. – BoBTFish

+1

Является ли ваше намерение вашей функцией get_image копировать данные изображения с камеры в буфер, который вы контролируете? –

ответ

3

The API Documentation, кажется, предполагает, что есть соответствующая функция is_FreeImageMem. Вы пробовали это?

Редактировать: похоже, что is_GetImageMem не может выделять память. Из его описания:

is_GetImageMem() возвращает начальный адрес последней памяти изображений, используемой для захвата изображения.

Вы звоните is_AllocImageMem в любом месте?

+1

Итак, мое чтение документации будет состоять в том, что вам нужно сопоставить вызовы 'is_AllocImageMem' и' is_FreeImageMem'. Это не похоже на то, что 'is_GetImageMem()' выполняет любое выделение. Ваш код работает на платформе, где у вас есть доступ к профилировщику? –

+0

В настоящее время работает Debian, попробует gprof как профилировщик –

0

Я запустил valgrind в коде, выход имел примерно 16 000 000 байт, возможно, был потерян, а примерно 20 000 000 байт косвенно потеряны.

Когда образ был извлечен из get_image и назначена IMG, IMG был назначен в качестве данных на OpenCV IplImage, как это:

IplImage* src = cvCreateImage(cvSize(752,480), IPL_DEPTH_8U, 1); 
    src -> imageData = img; 

IplImage был быть сохранен, так что я должен был назвать cvReleaseImage на IplImage хранится в памяти. Теперь valgrind сообщает, что косвенные потери составляют 0 и, возможно, потеряны примерно на 1600 000 человек. По-прежнему не учитывалось 1,6 миллиона, но я думаю, что IplImage значительно повлиял на утечку памяти.