为什么这个OpenCV代码会出错
Why does this OpenCV code segfault?
我正准备将我的一些C++OpenCV代码并行化。我遇到了一个误会,我不明白发生了什么。
这是代码:
class ExhaustiveComparisonMT
{
vector<Mat> *m_sigs;
Mat *m_dist;
public:
ExhaustiveComparisonMT(vector<Mat> sigs, Mat dist)
{
m_sigs = &sigs;
m_dist = &dist; // gdb breakpoint 1 here
}
void operator() (size_t last_row, size_t last_col) const
{
Mat diff = (*m_sigs)[0].clone(); // segfault happens here, gdb breakpoint 2 here
for (size_t i = 0; i != last_row; ++i)
for (size_t j = 0; j != last_row; ++j)
{
cv::absdiff((*m_sigs)[i], (*m_sigs)[j], diff);
m_dist->at<double>(i, j) = cv::sum(diff).val[0];
}
}
};
void
exhaustive_comparison(vector<Mat> sigs, Mat dist)
{
size_t width = sigs.size();
ExhaustiveComparisonMT ecmt(sigs, dist);
ecmt(width, width);
}
基本上,一个矩阵向量被传递给构造函数。指向矢量的指针被保留为成员变量,因此可以在exhaustive_comparison
中再次访问矢量。然而,该函数在尝试访问向量的第一个元素时出错。
我试图通过设置两个断点来诊断gdb的问题(请参阅代码(。在断点1:
(gdb) p (*m_sigs)[0]
$1 = (cv::Mat &) @0x7fffee77d010: {flags = 1124024325, dims = 2, rows = 1, cols = 712, data = 0x624ec0 "", refcount = 0x0, datastart = 0x624ec0 "", dataend = 0x6259e0 "",
datalimit = 0x6259e0 "", allocator = 0x0, size = {p = 0x7fffee77d018}, step = {p = 0x7fffee77d060, buf = {2848, 4}}}
因此,第一个元素被正确访问。现在,我们转到断点2并尝试相同的操作:
(gdb) p (*m_sigs)[0]
$2 = (cv::Mat &) @0x7fffee77d010: <error reading variable>
第一个元素似乎不再可访问!其地址相同(0x7fffee77d010(。这是怎么回事?
最后,如果我向前走,我会得到:
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7a0dd50 in cv::Mat::copyTo(cv::_OutputArray const&) const () from /usr/local/lib/libopencv_core.so.2.4
OpenCV试图访问第一个元素以克隆它,但失败了。
为什么第一个元素在构造函数中是可访问的,而在exhaustive_comparison
成员函数中是不可访问的?
ExhaustiveComparisonMT(vector<Mat> sigs, Mat dist)
{
m_sigs = &sigs;
m_dist = &dist; // gdb breakpoint 1 here
}
您通过复制的方式传递变量sigs
和dist
,这意味着它们的生存期仅限于此函数。
如果你试图获取他们的地址并在之后使用它,你将指向未知数据,因为在离开该功能时,这些对象将被销毁,他们的地址将在稍后用于其他用途。
如果您希望将传递的对象的地址作为参数,则应该使用引用——这样,您实际上将检索原始对象的地址。当然,假设你将lvalue传递给你的函数,并且它们在此期间没有被破坏,这将起作用。
ExhaustiveComparisonMT(vector<Mat> &sigs, Mat &dist)
{
m_sigs = &sigs;
m_dist = &dist; // gdb breakpoint 1 here
}
相关文章:
- 在Linux for Windows上编译C++代码时出错
- 尝试将另一个子句添加到代码中时出错
- 将代码从 Python 转换为 C++ 时出错
- <limits> 使用 VSC2019 编译旧代码时出错
- 使用 Visual Studio 代码读取 C++ 中的输入流时出错
- 在OpenGL中使用程序集代码渲染视频时出错
- 编译以下代码时出错
- Boost FFT示例-编译时出错,这段代码在做什么
- 编译在 Python 代码内部调用的 C++ 代码时出错,使用 Boost Python
- C++:为什么这段代码会出错?多元线性回归
- 混合开放MP/MPI代码中的多线程发送/接收时出错
- 将节点 js 代码集成到 cpp 库时出错
- 构建代码时出错
- 在字符串流中使用来自 github 的代码时出错
- 在主代码中调用 .hpp 函数时出错
- 将 find_if() 与数组一起使用的代码段中出错
- 我在字数C++的代码中哪里出错了
- 尝试从 Github 编译 OpenCV QT 代码时出错
- 编译创建 Eigen::ThreadPoolDevice 对象的代码时出错
- 编译 .cu 与 .cpp:即使没有任何 CUDA 代码,编译器也会出错