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

时间:2014-05-11 20:01:05

标签: android c++ opencv vector mat

我正在开发Android应用程序,我的本机代码中存在此问题。

这些载体是全球性的。

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

我也有这个函数,其中描述符和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());
    }

}

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

我发现此错误致命信号11(SIGSEGV)位于0x00000001(代码= 1)并且由线路引起

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

但我不知道为什么。

2 个答案:

答案 0 :(得分:0)

尝试将listaMatDes.push_back(aux_des->clone());分开:

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

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

答案 1 :(得分:0)

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

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