调试断言失败-DirectShow筛选器正在调用OpenCV函数-仅限发布模式

Debug Assertion Failed - DirectShow Filter calling OpenCV Function - Release mode only

本文关键字:布模式 模式 函数 OpenCV -DirectShow 失败 断言 筛选 调用 调试      更新时间:2023-10-16

我正在编程一个DirectShow筛选器,该筛选器使用OpenCV HaarcascadeClassifier检测对象。它在调试模式下工作正常,但在发布模式下工作不正常,我不确定OpenCV函数(OpenCV_249 libs的VC 2010二进制文件)中是否存在内存泄漏,或者我的项目(设置)是否有问题。

我正在GraphStudio中加载过滤器,这是一个可以轻松构建DirectShow FilterGraph的工具。我不确定是否有关于要在调试模式下编译的过滤器DLL的假设。

经过一些预处理,我基本上正在做以下工作:

std::vector<cv::Rect> objects;
mClassifier.detectMultiScale(inputGray,objects, 1.3);
for(unsigned int i=0; i<objects.size(); ++i)
{
    cv::rectangle(outputImage, objects[i], cv::Scalar(255,255,255));
}

因此,在功能块中,我正在进行预处理,然后是显示的代码部分,然后将数据写入DirectShow缓冲区。

如果我在Release模式下使用DLL,我会收到以下错误消息AFTER整个函数终止(因此可能在DirectShow Filtergraph的其他地方):

Debug Assertion Failed!
Program: C:Program Files (x86)Graphstudiographstudio.exe
File: f:ddvctoolscrt_bldself_x86crtsrcdbgdel.cpp
Line: 52
Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
For information [...]

然后是

Debug Assertion Failed!
Program: C:Program Files (x86)Graphstudiographstudio.exe
File: f:ddvctoolscrt_bldself_x86crtsrcdbgdel.cpp
Line: 1322
Expression: _CrtlsValidHeapPointer(pUserData)

当我把mClassifier.detectMultiScale(inputGray,objects, 1.3);注释掉时,过滤器不会崩溃。尽管有些事情可能会被优化掉,但我用一个循环替换了detectMultiScale调用,该循环随机(之前用时间(NULL)进行种子设定)将cv::Rect对象插入到向量中。过滤器不会崩溃,并以我假设的方式显示随机矩形。

我读到其他人观察到(valgrind)cv::CascadeClassifiert::detectMultiScale会产生内存泄漏。我发现了一个链接,其中有人对detectSingleScale有问题,一些OpenCV提交者将其标记为已修复(http://code.opencv.org/issues/2628)。

问题:

这个确切的问题(见前面的链接)是否有可能(仍然)在detectMultiScale中?

这个问题是否有可能不在我的项目中,而是在OpenCV库中?

为什么这个问题只在发布模式下发生?

为什么这个问题只出现在DirectShow筛选器中?(如果我在独立项目中以Release模式运行"相同"的代码/功能,我不会得到Debug Assert Failed错误——尽管可能存在无法识别的内存损坏?!?)。

我希望有人有一个想法和thx提前!

编辑:

好的。。。我曾联系过msvcrtd.lib。。。从我的项目中删除了整个lib(似乎我甚至不需要它),它现在"有效"了。。。剩下的问题是,是否存在某种内存泄漏。或者,与那个自由党的联系是唯一的全部问题吗?

好的。。。我链接了msvcrtd.lib…

从我的项目中删除了整个库(所以添加了默认的库?!?),它现在"工作"了。。。

剩下的问题是,是否存在某种内存泄漏。或者,与那个自由党的联系是唯一的全部问题吗?

愚蠢的我…