Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
传递对象C++;团结 < >我想从C++代码返回一个MAT对象到Unity。但是,在C++部分,像,我会访问访问错误。 Unity Editor [version: Unity 2017.3.0f3_a9f86dcd79df] SaliencyCV.dll caused an Access Violation (0xc0000005) in module SaliencyCV.dll at 0033:270027f0. Error occurred at 2018-03-06_235212. C:\Program Files\Unity\Editor\Unity.exe, run by Dilara. 43% memory in use. 16266 MB physical memory [9199 MB free]. 18698 MB paging file [9861 MB free]. 134217728 MB user address space [134185466 MB free]. Read from location 990d0000 caused an access violation. 这里是C++代码: uchar* cppMethod(uchar* frameData, int WIDTH, int HEIGHT, int* rows, int* cols) { Mat img(HEIGHT, WIDTH, CV_8UC3); img.data = frameData; flip(img, img, 0); Mat result = calculateSaliency(img); *rows = result.rows; *cols = result.cols; int length = result.rows * result.cols * 3; uchar* tmpArr = result.data; uchar* resultArray = new uchar[length]; for (int i = 0; i < length; i++) { resultArray[i] = tmpArr[i]; } return resultArray; } uchar*cppMethod(uchar*frameData,int-WIDTH,int-HEIGHT,int-rows,int-cols) { 材料img(高度、宽度、CV_8UC3); img.data=帧数据; 翻转(img,img,0); Mat结果=计算弹性(img); *rows=result.rows; *cols=result.cols; int length=result.rows*result.cols*3; uchar*tmpArr=result.data; uchar*resultArray=新的uchar[length]; for(int i=0;i_C++_Opencv_Access Violation - Fatal编程技术网

传递对象C++;团结 < >我想从C++代码返回一个MAT对象到Unity。但是,在C++部分,像,我会访问访问错误。 Unity Editor [version: Unity 2017.3.0f3_a9f86dcd79df] SaliencyCV.dll caused an Access Violation (0xc0000005) in module SaliencyCV.dll at 0033:270027f0. Error occurred at 2018-03-06_235212. C:\Program Files\Unity\Editor\Unity.exe, run by Dilara. 43% memory in use. 16266 MB physical memory [9199 MB free]. 18698 MB paging file [9861 MB free]. 134217728 MB user address space [134185466 MB free]. Read from location 990d0000 caused an access violation. 这里是C++代码: uchar* cppMethod(uchar* frameData, int WIDTH, int HEIGHT, int* rows, int* cols) { Mat img(HEIGHT, WIDTH, CV_8UC3); img.data = frameData; flip(img, img, 0); Mat result = calculateSaliency(img); *rows = result.rows; *cols = result.cols; int length = result.rows * result.cols * 3; uchar* tmpArr = result.data; uchar* resultArray = new uchar[length]; for (int i = 0; i < length; i++) { resultArray[i] = tmpArr[i]; } return resultArray; } uchar*cppMethod(uchar*frameData,int-WIDTH,int-HEIGHT,int-rows,int-cols) { 材料img(高度、宽度、CV_8UC3); img.data=帧数据; 翻转(img,img,0); Mat结果=计算弹性(img); *rows=result.rows; *cols=result.cols; int length=result.rows*result.cols*3; uchar*tmpArr=result.data; uchar*resultArray=新的uchar[length]; for(int i=0;i

传递对象C++;团结 < >我想从C++代码返回一个MAT对象到Unity。但是,在C++部分,像,我会访问访问错误。 Unity Editor [version: Unity 2017.3.0f3_a9f86dcd79df] SaliencyCV.dll caused an Access Violation (0xc0000005) in module SaliencyCV.dll at 0033:270027f0. Error occurred at 2018-03-06_235212. C:\Program Files\Unity\Editor\Unity.exe, run by Dilara. 43% memory in use. 16266 MB physical memory [9199 MB free]. 18698 MB paging file [9861 MB free]. 134217728 MB user address space [134185466 MB free]. Read from location 990d0000 caused an access violation. 这里是C++代码: uchar* cppMethod(uchar* frameData, int WIDTH, int HEIGHT, int* rows, int* cols) { Mat img(HEIGHT, WIDTH, CV_8UC3); img.data = frameData; flip(img, img, 0); Mat result = calculateSaliency(img); *rows = result.rows; *cols = result.cols; int length = result.rows * result.cols * 3; uchar* tmpArr = result.data; uchar* resultArray = new uchar[length]; for (int i = 0; i < length; i++) { resultArray[i] = tmpArr[i]; } return resultArray; } uchar*cppMethod(uchar*frameData,int-WIDTH,int-HEIGHT,int-rows,int-cols) { 材料img(高度、宽度、CV_8UC3); img.data=帧数据; 翻转(img,img,0); Mat结果=计算弹性(img); *rows=result.rows; *cols=result.cols; int length=result.rows*result.cols*3; uchar*tmpArr=result.data; uchar*resultArray=新的uchar[length]; for(int i=0;i,c++,opencv,access-violation,C++,Opencv,Access Violation,有人能帮我吗?您应该调用正确的Mat构造函数,以使对象不释放/破坏相应的内存位置数据指向。您可以在中了解这种行为 代码的问题是 Mat img(HEIGHT,WIDTH,CV_8UC3)分配一个大小为HEIGHT*WIDTH的CV_8UC3类型的内存块,该内存块未被使用(因为您正在更改数据成员变量以指向不同的内存位置) 在函数退出时,img被销毁,这导致调用release(),这反过来会销毁frameData,这不是预期的行为 将前两行改为 Mat img(HEIGHT, WIDTH, CV_8

有人能帮我吗?

您应该调用正确的
Mat
构造函数,以使对象不释放/破坏相应的内存位置
数据
指向。您可以在中了解这种行为

代码的问题是

  • Mat img(HEIGHT,WIDTH,CV_8UC3)
    分配一个大小为
    HEIGHT*WIDTH
    CV_8UC3
    类型的内存块,该内存块未被使用(因为您正在更改
    数据
    成员变量以指向不同的内存位置)
  • 在函数退出时,
    img
    被销毁,这导致调用
    release()
    ,这反过来会销毁
    frameData
    ,这不是预期的行为
  • 将前两行改为

    Mat img(HEIGHT, WIDTH, CV_8UC3, frameData);
    
    如果您正在将
    resultArray
    传递到C#,在C#中您很可能没有管理指向内存的生命周期,那么您很可能会发生内存泄漏@程序员已经在回答了你之前的问题时提出,你应该把内存分配给C,把它传递给C++,并在C++中写下。 简言之,您应该有如下内容:

    #包括
    void cppMethod(uchar*frameData、uchar*out、常量int WIDTH、常量int HEIGHT、,
    整数*行,整数*列){
    /*此构造函数将不会管理frameData的生存期*/
    材料img(高度、宽度、CV_8UC3、框架数据);
    /*就地操作*/
    翻转(img,img,0);
    /*局部变量---它将被正确地销毁*/
    Mat结果=计算弹性(img);
    /*如果行和列是通过引用传递的标量,则定义良好*/
    *rows=result.rows;
    *cols=result.cols;
    /*确保长度不会溢出*/
    int length=result.rows*result.cols*3;
    /*你不需要这个*/
    //uchar*tmpArr=结果数据;
    /*你不这么做*/
    //uchar*resultArray=新的uchar[length];
    //使用std::从
    //for(int i=0;i
    你确定
    tmpArr
    的大小大于
    长度吗?实际上我不确定。我需要做的是将结果(Mat对象)分配给uchar*并返回统一。TMPARLY是一个辅助对象,需要数据大小。我不知道如何得到它。我们如何知道这个问题,而不是代码的C端。因为C++部分的错误,我不需要共享C++的部分。C代码中的错误在执行C++代码时很容易表现为运行时错误。如果你不想表明双方的观点,我们就结束这个问题。不客气!但是请确保你在就地版本中,你预先分配内存在C,并传递给C++直接修改。否则,在调用
    cppMethod
    时,每个帧都会泄漏内存。这是一个比修复代码中的构造函数错误更严重的问题。我认为OP仍然会按照她的方式去做,因为OP的最后几个问题@DilaraAlbayrak如果您仍然希望这样做,那么就编写一个函数来取消分配已分配的
    resultArray
    变量。如果你现在不这样做,你会像Arda警告你的那样,遇到很多问题。@Programmer,我认为你在评论中给出了错误的链接,或者?我不想先分享我的建议,因为我已经阅读了你对她之前问题的详细回答,但我还是忍不住——这个漏洞很严重。哈哈,我甚至不知道这是怎么发生的。我的意思是链接。