C++ - SIGSEGV 在向量<Mat> 上执行 push_back

Posted

技术标签:

【中文标题】C++ - SIGSEGV 在向量<Mat> 上执行 push_back【英文标题】:C++ - SIGSEGV doing push_back on a vector<Mat> 【发布时间】:2014-05-11 20:01:04 【问题描述】:

我正在开发一个 android 应用程序,我的本机代码中有这个问题。

这些向量是全局的。

vector<Mat> listaMatDes;
vector<Mat> listaMatKey;
vector<int> listaCols;
vector<int> listaRows;

我也有这个函数,其中descriptors和keyPoints包含一些Mats的地址(使用这个函数getNativeObjAddr()):

void rellenarObjetos(jlong* keyPoints, jlong* descriptors, jint* cols, jint* rows, int length)

    for(int i=0; i<length; i++)

        listaCols.push_back(cols[i]);
        listaRows.push_back(rows[i]);

        Mat* aux_des=(Mat*)descriptors[i];
        listaMatDes.push_back(aux_des->clone());

        Mat* aux_key=(Mat*)keyPoints[i];
        listaMatKey.push_back(aux_key->clone());
    


我检查了两个辅助Mat,它们创建得很好。

我有这个错误致命信号 11 (SIGSEGV) at 0x00000001 (code=1) 它是由线路引起的

listaMatDes.push_back(aux_des->clone());

但我不知道为什么。

【问题讨论】:

【参考方案1】:

尝试将listaMatDes.push_back(aux_des-&gt;clone());分隔在:

Mat m = aux_des->clone();
listaMatDes.push_back(m);

这样,你可以看到错误是否真的在push_back中,我会说它可能在克隆中。

【讨论】:

【参考方案2】:

一整天的编程让你发疯(而且很傻,至少对我来说),我从 java 代码中传递了一个 LOCAL 垫地址数组(使用函数 getNativeObjAddr() 创建的 long[]它返回垫子内存中的地址),所以它不会工作......

我通过创建一个长数组作为类字段并传递这个数组来解决它。

【讨论】:

以上是关于C++ - SIGSEGV 在向量<Mat> 上执行 push_back的主要内容,如果未能解决你的问题,请参考以下文章

Opencv C++读取分配给特征向量的opencv Mat

OpenCV / C++ - 如何在向量上使用adaptiveThreshold而不是Mat?

OpenCV C++:根据存储在 int 向量中的索引为 Mat 类型数据创建列范围

通过向量迭代(使用迭代器)会导致 SIGSEGV 但在索引中使用时有效 - 那怎么样?

使用并行编程 C++ 计算/访问向量

开发 C++ 中的 SIGSEGV(分段错误)错误