传递对象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,我认为你在评论中给出了错误的链接,或者?我不想先分享我的建议,因为我已经阅读了你对她之前问题的详细回答,但我还是忍不住——这个漏洞很严重。哈哈,我甚至不知道这是怎么发生的。我的意思是链接。