将引用参数传递给dll时出现损坏

时间:2013-07-24 14:11:17

标签: c++ opencv dll pass-by-reference corruption

首先,我在WinXp上使用OpenCV 2.4.2和Visual 2008。这是问题所在:

我正在使用imwrite函数来编写具有以下原型的灰度图像:

bool imwrite( const string& filename, InputArray img, const vector<int>& params=vector<int>());

先前已检查并设置了图像类型(8位,1通道)。 但是,在我的情况.\Images\Debug\calibration_ref.bmp中,我只在发布模式中遇到异常(错误-2,无法找到指定扩展名的编写者)来编写bmp图像。 我不明白这个文件名有什么问题。

Clue

深入了解dll源文件(opencv_highgui242d.dll,loadsave.cpp,l.298)之后,我意识到参数const std::string & filename(至少这一个......)已损坏(或被释放?)由于<Bad Ptr>。为了得到这个结果,我在Release模式下使用了highgui调试版dll,否则,使用highgui发行版,我会得到垃圾字符串。我怀疑所有论据都被破坏了。

Clue2

我完全不知道这个腐败来自哪里!我在这里和那里搜索但是我能找到的所有内容都与发布模式中的优化禁用有关,然后是关于线程安全的bug修复和this article字符串类,但我不确定这是问题。

我想补充说我使用的OpenCV版本不是包。我特别用TBB(版本4.0 6005)构建它。随意提出更多问题。

2 个答案:

答案 0 :(得分:0)

您正在查看发布版本,因此调试器将无法显示所有值,因为优化将删除某些对象。我认为你因为“腐败”而陷入了一个兔子洞。

你说错误是error -2, could not find a writer for the specified extension所以你看看为什么会这样?在调试模式下使用什么编写器,以及在发布模式下可用的原因。它可能只是您工作目录中缺少的DLL。

我建议您也更改输出文件名,这样您就不会对每个构建的输出感到困惑。例如,.\Images\Debug\calibration_ref.bmp可能会更好.\Images\Release\calibration_ref.bmp

答案 1 :(得分:0)

问题来自静态初始化顺序。

因为文件名被声明为静态,这取决于其他静态(我在这个项目中有很多静态变量),我有未初始化的变量作为参数。这就是为什么它以不好的论点引发异常的原因。

由于变量初始化和函数执行的断点,我可以跟踪这种现象。执行首先发生...... 但是,在输入函数之前,最好先跟踪参数(而不是强制显示OutputDebugString或某些内容,因为跟踪在发布模式下不起作用)。