【问题标题】:Releasing data from a char* in C++在 C++ 中从 char* 释放数据
【发布时间】:2014-01-25 06:14:27
【问题描述】:

我正在从 uEye 工业相机中提取数据,并通过相机的 API 检索图像。

我的代码如下所示:

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;
}

我正在检索一张图片数据,如果成功则返回true,否则返回false。

问题是我相信我正在使用 img = (char*) pMemVoid 泄漏内存,因为我反复调用此函数而不释放此数据。如何释放分配给 img 的内存?

编辑:

我在使用 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;
}

【问题讨论】:

  • api 的文档应该告诉你这一点。他们可能有自己特殊的free 功能。
  • 实际上,看着here,您似乎获得了指向其他地方拥有/管理的一些内存的指针,尽管它并不完全清楚(也许是了解这个库的人)。所以我认为你不需要在这里做任何事情。
  • 您是否打算使用 get_image 函数将图像数据从相机复制到您控制的缓冲区中?
  • 正确,可以控制的图像缓冲区。 img 由 get_image 使用,而 get_image 又被用作 OpenCV IplImage 的数据。我认为它重复调用 get_image 函数,但不处理每次调用 get_image 时创建的图像数据

标签: c++ memory-management memory-leaks void-pointers


【解决方案1】:

The API Documentation 似乎暗示有一个相应的 is_FreeImageMem 函数。你试过吗?

编辑:看起来 is_GetImageMem 可能没有分配内存。从它的描述来看:

is_GetImageMem()返回上次用于抓图的图像内存的起始地址。

你在哪里打电话给is_AllocImageMem

【讨论】:

  • 因此,我对文档的阅读是您需要匹配is_AllocImageMemis_FreeImageMem 的调用。看起来is_GetImageMem() 没有进行任何分配。您的代码是否在您可以访问探查器的平台上运行?
【解决方案2】:

我在代码上运行了 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 被保留,所以我不得不对存储在内存中的 IplImage 调用 cvReleaseImage。现在 valgrind 报告间接损失为 0,可能损失约为 1,600,000。仍然没有占到 160 万,但我认为 IplImage 对内存泄漏的贡献很大

【讨论】:

    猜你喜欢
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-02
    • 1970-01-01
    • 2022-07-26
    • 2018-09-16
    • 1970-01-01
    相关资源
    最近更新 更多