将字符串引用作为参数传递时出现错误的 Ptr

Posted

技术标签:

【中文标题】将字符串引用作为参数传递时出现错误的 Ptr【英文标题】:Bad Ptr when passing string reference as argument 【发布时间】:2011-06-08 10:08:02 【问题描述】:

我一直试图理解为什么下面的代码在字符串“文件名”上给了我一个错误的指针:

Mat imread(const string& filename, int flags)  
    // some code returning a Mat object 


int main() 
    string s = "test.jpg";
    imread(s, 0);

我已经一步一步调试了,我得到的只是在输入imread之前,字符串很好(我能够检查它的每个元素),但之后就不可能了,并且调试器指责了一个 Bad Ptr。我不确定我是否理解为什么会这样。

您知道,我使用的是 Visual Studio 2008 和 OpenCV 2.2。

编辑:我确实忘记说一件重要的事情,这对我解决这个问题至关重要:我在 .cu 文件上编写此代码,因此首先由 nvcc 编译。

【问题讨论】:

“给我一个错误的指针”?您发布的代码很好(除了未声明的Mat 和缺少返回语句),所以问题(不管是什么......你实际上并没有说)在其他地方。你能发布一个最小的、完整的测试用例来演示这个问题吗?或者至少是调试器的一些输出? opencv 已经有了imread 函数,为什么要重新定义呢? @Nawaz:好吧,我使用 OpenCV GPU,但我没有主动在 CPU 上创建任何其他线程。 @etarion:我这里写的imread其实是OpenCV的imread。我只是写了函数的标题,所以不熟悉 OpenCV 的人会明白我在说什么。 @Tomalak:对不起,如果我不清楚,但问题是在进入方法之前和之后对字符串的引用不一样,因为调试器指责“错误指针” ,这意味着它引用的东西不是我想要引用的东西。 Mat 是一个在别处定义的类,我在函数内的注释说“一些返回 Mat 对象的代码”,因此假设在实际代码中有一个 return 语句。 :) 【参考方案1】:

为原生代码编写调试器是一项不平凡的任务。机器代码与源代码之间没有一一对应的关系。调试器提供此类误导性信息是很常见的,但这并不意味着实际值无效。还要确保在打开调试信息并关闭所有优化的情况下进行编译。

注意:当你进入一个函数时,堆栈帧可能还没有被初始化。多做一步可能会显示正确的参数。

【讨论】:

【参考方案2】:

我通过在不同的文件中将所有 OpenCV 代码与涉及 CUDA 扩展的代码分开来解决了这个问题。因此,现在从 .cpp 文件调用 imread 并且涉及 CUDA 的所有内容都位于不同的 .cu 和 .h 文件中。

如果我错了,请纠正我,但我认为这不应该是那样,也许这是一个错误。

【讨论】:

以上是关于将字符串引用作为参数传递时出现错误的 Ptr的主要内容,如果未能解决你的问题,请参考以下文章

如何将枚举作为字符串参数传递给 Authorize 属性?

从 rexx 代码向 ispf 宏传递参数时出现无效长度错误

为啥在将命令行图像文件中的参数作为参数传递时出现错误

std::unique_ptr 作为参数在 std::thread 中起作用 [重复]

将变量名称作为参数从外部函数传递到 R 中的内部函数时出现问题?

在测试中使用 unique_ptr 时出现无效指针错误