首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在C++中完全释放cv::Mat的内存

如何在C++中完全释放cv::Mat的内存
EN

Stack Overflow用户
提问于 2016-09-05 14:20:41
回答 2查看 7.2K关注 0票数 5

当我尝试创建一个cv::Mat并在之后发布它(下面的代码)时,我仍然(根据valgrind的说法)每个Pixel有大约1字节的内存泄漏。

有人知道如何正确释放cv::Mat的内存吗?

(谢谢你的答复:)

代码:

代码语言:javascript
运行
复制
int main(int argc, char** argv)
{
  cv::Mat* matrx = new cv::Mat(1000,1000,CV_8UC1,0.);
  matrx->release();
  delete matrx;
  return 0;
}

瓦兰:

代码语言:javascript
运行
复制
[...]
==29420==    1,000,028 bytes in 1 blocks are definitely lost in loss record 372 of 372
==29420==    at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==29420==    by 0x5438877: cv::fastMalloc(unsigned long) (in /usr/lib/x86_64-linux-gnu/libopencv_core.so.2.4.8)
==29420==    by 0x536FE2A: cv::Mat::create(int, int const*, int) (in /usr/lib/x86_64-linux-gnu/libopencv_core.so.2.4.8)
==29420==    by 0x426FB5: cv::Mat::create(int, int, int) (mat.inl.hpp:663)
==29420==    by 0x426ECD: cv::Mat::Mat(int, int, int, cv::Scalar_<double> const&) (mat.inl.hpp:347)
==29420==    by 0x425A09: main (main.cpp:18)
==29420== 
==29420== LEAK SUMMARY:
==29420==    definitely lost: 1,000,028 bytes in 1 blocks
==29420==    indirectly lost: 0 bytes in 0 blocks
==29420==      possibly lost: 5,072 bytes in 95 blocks
==29420==    still reachable: 304,758 bytes in 1,348 blocks
==29420==         suppressed: 0 bytes in 0 blocks
[...]
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-23 09:45:48

opencv的反馈似乎很清楚:您使用OpenCV 3.x编译,但在运行时使用OpenCV 2.4.8。由于它们不是二进制兼容的,所以不能正确释放cv::Mat。让您将LD_LIBRARY_PATH导出到用于编译的OCV_DIST/lib of OpenCV 3.x。

请注意,如果您delete指针,您甚至不需要release()之前。

票数 4
EN

Stack Overflow用户

发布于 2016-11-18 02:02:19

引用文档页中的以下内容:(structures.html#mat-release):

这个方法减少了与矩阵数据相关联的引用计数器。当引用计数器达到0时,矩阵数据被解除分配,数据和引用计数器指针被设置为NULL。

上面的意思是,当您执行“删除matrx;”时,您正在尝试删除一个已经指向NULL的内存区域,这将生成一个运行时错误。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39332621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档