【问题标题】:What causes double free or corruption (out) error?是什么导致双重释放或损坏(输出)错误?
【发布时间】:2017-02-21 18:54:34
【问题描述】:

可能重复: OpenCV double free or corruption (out): Aborted (core dumped)

我创建了一个函数,它将从客户端接收图像并在服务器中使用 OpenCV 来处理图像并返回数据。 我意识到只有在使用函数 free() 时才会出现此错误。下面是我函数中的代码。

// 2. Create Mat Image
Mat image = Mat::zeros(height, width, CV_8UC3);
uchar sockData[imageSize];

//Receive Image data here
printf("Receiving Image Data\n");
for (int i = 0; i < imageSize; i += bytecount)
{
   if ((bytecount = recv(*csock, sockData +i, imageSize - i, 0)) == -1)
   {
      fprintf(stderr, "Error receiving image %d\n", errno);
   }
}
// deallocate 
deallocateMemory(csock);

// Image Data Received, Now Reconstructing Image
printf("Image Data Received, Now Reconstructing\n");
int ptr = 0;
for (int i = 0; i < image.rows; i++)
{
  for (int j = 0; j < image.cols; j++)
  {
      image.at<cv::Vec3b>(i,j) = cv::Vec3b(sockData[ptr+0],sockData[ptr+1],
      sockData[ptr+2]);ptr = ptr + 3;
   }
}
// Write produced output to stdout - Print
printf("Image Processed, now Displaying Results...\n");
displayResultsOnConsole(results);

// free(sockData);
return 0;

当我取消注释 free(sockData); 时出现错误 我做错什么了吗?

【问题讨论】:

  • uchar sockData[imageSize]; 是堆栈分配的,所以free() 失败了。

标签: c++ sockets opencv


【解决方案1】:

您只能将与从malloc(或NULL,什么都不做)得到的指针完全相同的指针传递给free。你违反了这条规则,那么糟糕的事情就会发生。

【讨论】:

  • 哦,现在我明白了。当我使用malloc时,我只能使用free,谢谢
  • 对,或者其他从同一个分配器分配的函数,例如strduprealloc。内存分配器就像图书馆——你只能签入从同一个图书馆借出的书。
  • 知道了!谢谢:-)
【解决方案2】:

呃。您在堆栈上分配并希望在堆上解除分配?

您设法添加了分配在堆栈上的这个大块? -> 那就不用担心了。

在堆栈上分配图像字节的不好做法,因为这通常很大。 -> 在堆上分配,从堆中释放。

【讨论】:

  • 你说的太对了。当我使用高分辨率图像时失败了,就像你和@DavidSchwartz 说的那样,我改用malloc 并且一切正常。谢谢:-)
猜你喜欢
  • 2021-12-04
  • 1970-01-01
  • 1970-01-01
  • 2011-03-12
  • 2013-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-06
相关资源
最近更新 更多