OpenCV Mat中的动态内存释放错误

Posted

技术标签:

【中文标题】OpenCV Mat中的动态内存释放错误【英文标题】:dynamic memory deallocation error in OpenCV Mat 【发布时间】:2016-03-28 08:00:07 【问题描述】:

我想知道 OpenCV Mat 默认构造函数是否已经分配了内存?如文档中所示

>     These are various constructors that form a matrix. As noted in the Automatic Allocation of the Output Data, often the default constructor
> is enough, and the proper matrix will be allocated by an OpenCV
> function.

这是否意味着在我的程序结束时发生的释放是正确的。那是对的吗?

实际上,我在程序结束的内存释放阶段遇到了(核心转储)错误。我的初始代码引入了一个 OpenCV Mat,即 Mat A 没有对其进行初始化,这会产生错误。我通过使用初始化修复了这个错误,即 A = Mat::zeros(...)

我想确认我之前的疑问。如果是真的,每次声明 Mat 时都要初始化它是相当不方便的

对不起,我的解释不好!如果我不够清楚,请回复我

【问题讨论】:

忘记提Mat变量在类中声明,类析构函数造成内存错误 请给我们看一个小案例 【参考方案1】:

这是否意味着释放发生在我的末尾 程序是正确的。对吗?

cv::Mat 自行分配内存并在共享相同数据的所有cv::Mat 超出范围时释放它(类似于std::shared_ptr)。

我想确认我之前的疑问。如果是真的,那是相当的 每次声明时都必须初始化 Mat 很不方便

不,这是错误的。但是,由于您没有显示代码,我只能猜测您没有正确链接 OpenCV 哟您的项目,因为一个没有良好链接的 OpenCV 在cv::Mat 破坏阶段导致错误是一个著名的案例。

【讨论】:

对不起,我试过但无法在一个小项目中复制错误!顺便说一句,您能否进一步解释一下 OpenCV 的链接错误?但我的程序并没有一直出现这个错误,但只有一种情况 我没有太多信息。但是,当您在链接到 OpenCV 时混合 32-64 或发布调试二进制文件时,可能会出现此问题。所以,仔细检查所有的 dll 和库 如果我使用初始化,即 A = Mat::zeros(...),问题就解决了(在 cmd 行运行中)。但是,如果我使用调试跟踪代码,它仍然会出现 不,它没有修复。它已被隐藏。如果您确定自己没有做错任何事情,请确保 OpenCV 与所有需要的配置完美链接并且应该得到解决。或者输入您正在使用的代码,以便我们确保其中没有任何错误 我会再次尝试编译更小的代码并上传

以上是关于OpenCV Mat中的动态内存释放错误的主要内容,如果未能解决你的问题,请参考以下文章

动态内存管理详解(动态内存函数介绍 + 常见动态内存错误 + 经典笔试题)

C语言进阶动态内存管理

OpenCV Mat的总结

C语言学习笔记(16)动态内存管理

C语言:动态内存错误

动态内存管理