【发布时间】:2013-10-25 18:37:41
【问题描述】:
考虑以下代码示例。为什么下面标记的行会在运行时触发断点/异常?
int main() {
Mat m1 = Mat::zeros(10, 1, CV_32FC1);
Mat m2 = Mat::zeros(10, 3, CV_32FC1);
vector<float> v1(m1); // works
Mat m2sub = m2.col(0);
Mat m2subClone = m2.col(0).clone();
vector<float> v2(m2subClone); // works
vector<float> v3(m2sub); // doesn't work
return 0;
}
这似乎很奇怪,因为被调用的是在 mat.hpp 中:
template<typename _Tp> inline Mat::operator std::vector<_Tp>() const {
std::vector<_Tp> v;
copyTo(v);
return v; // <- breaks here
}
并且 copyTo 似乎在 memcpy 数据。
它没有给出错误消息,但我在堆栈跟踪中看到它在 return 语句处中断,然后深入到“operator new”和“ntdll.dll!RtlpAllocateHeap()”的某个地方。
奇怪的是,在我的完整代码中,它在一个稍微不同的地方中断:在 memcpy 的 copyTo(v) 内,并抛出“访问冲突写入位置 0x0000000001F43D4C。”。我的完整代码看起来和上面的一模一样,但是矩阵更大。
编辑:如果在上面的示例中,我将矩阵更改为
Mat m1 = Mat::zeros(5900, 1, CV_32FC1);
Mat m2 = Mat::zeros(5900, 3, CV_32FC1);
sn-p 在与我的完整代码相同的地方失败,出现访问冲突错误。
我有超过 2GB 的可用 RAM,并且该应用程序被编译为 64 位应用程序,因此它不应该是“内存不足”问题 (?)
【问题讨论】:
-
根据您使用的平台,行为似乎存在一些差异(请参阅 Luiz 回答下的 cmets)。您使用的是什么编译器和 OpenCV 版本?
-
@Aurelius 我正在使用 VS2012,64 位,OpenCV 来自 Git,几个月前(3 月至 7 月的东西。Git 显示 2.4.4/2.4.5,但是 dll 的后缀为 249 。我也许可以深入挖掘并找出是否相关。)