C# 调用OpenCVSharp报错“尝试读取或写入受保护的内存。这通常指示其他内存已损坏”
一、描述问题
当托管代码调用非托管代码的时候,经常会出现如下报错:“尝试读取或写入受保护的内存。这通常指示其他内存已损坏”。
二、原因分析
由于非托管代码的内存指针的回收是由非托管代码自身手动完成的,而不是像托管代码一样有统一的垃圾回收机制,比如.NET的GC。
所以对于托管代码的调用方来说无法控制其内存回收。以上问题的产生原因很可能是托管代码调用了已经被回收的非托管对象。封装
的好一点的非托管代码一般都会有内存释放的接口供外部调用,这样调用方就可以管理非托管代码的内存回收。
三、解决方法
尽量不用使用不确定的非托管代码里面提供的对象。如果必须使用的话,实例化完成后直接使用而不要通过什么方法传递,委托回调等方式来
获取里面的对象,在这些复杂未知的过程中,很可能非托管的对象已经被回收了。
四、示例说明
当使用C#调用OpenCVSharp的时候,经常会出现以上问题。
错误代码如下:
1、订阅鼠标回调方法,并将mat的指针Data作为参数传递给回调方法。
private void button15_Click(object sender, EventArgs e)
{
Mat mat = GetMat();//获取Mat对象
Cv2.SetMouseCallback("输入图像", GetRGBCvMouseCallback, mat.Data);
}
2、回调方法,获取每个点的RGB值
private void GetRGBCallbackMethod(MouseEvent @event, int x, int y, MouseEvent flags, IntPtr userdata)
{
switch (@event)
{
case MouseEvent.LButtonDown: using (Mat mat = new Mat(Rows, Cols, _MatType, userdata))//这种方式会被内存回收,直接在这里面获取对象
{
for (int i = ; i < Rows; i++)
{
for (int j = ; j < Cols; j++)
{
Vec3b s = mat.At<Vec3b>(j, i);//获取第i0行第i1列) 这个方法会死 尝试读取收保护内存
} }
}
break;
default:
break;
}
运行报错,截图如下:

正确代码:
将7行代码Mat mat = new Mat(Rows, Cols, _MatType, userdata)改成using (Mat mat=GetMat()) ,就不会出现以上问题。
原因分析:
原因很可能是userData中回调的过程中已经被回收了,当再次使用时就会报尝试访问被保护的内存的错误。为了
防止此问题的发生,解决办法就是重新实例化一个Mat对象,不使用可能被回收的userData数据。
C# 调用OpenCVSharp报错“尝试读取或写入受保护的内存。这通常指示其他内存已损坏”的更多相关文章
- asp.net报错“尝试读取或写入受保护的内存。这通常指示其他内存已损坏”的解决办法
来源:http://ajxfxb.blog.163.com/blog/static/56675086201411634336878/ 作者是:没完没了的工作 asp.net报错“尝试读取或写入受保护的 ...
- Sql Server尝试读取或写入受保护的内存。这通常指示其他内存已损坏
今日遇到这样一个问题,用vs2010调试C#代码时,只要代码一运行到跟数据库关联的地方时,编译器就报错误,给的提示如:调试器已附加,要继续需要分离什么的,咋一看还以为是vs中调试器设置的问题,可后来仔 ...
- C#,调用dll产生 "尝试读取或写入受保护的内存 。这通常指示其他内存已损坏。"的问题
由于易语言与c#做的DESC加解密方式,返回的数据不一致,所以,我用易语言写了一个dll,供c#调用, 结果在post的时候,有时候能正确返回数据,有时候则不能正常返回,而是返回空数据(c#没有做异常 ...
- SQLServer2012在登录远程服务器实例时报错:尝试读取或写入受保护的内存
SQLServer2012在登录远程服务器实例时报错:尝试读取或写入受保护的内存.这通常指示其它内存已损坏.(System.Data). 而登录本地数据库实例则能顺利登入,不存在上述问题. 试一试重置 ...
- ArcEngine尝试读取或写入受保护的内存
先说一下我的开发环境: Win10 + ArcGIS10.0 + ArcEngine10.0 + Framework4.0 今天调用新的GP工具则出现"尝试读取或写入受保护的内存.这通常指示 ...
- windows7 Sql server 2012 尝试读取或写入受保护的内存。这通常指示其他内存已损坏的修复
项目中,使用了sql server2012数据库,服务端是2012,客户端如果是2008的话,就会报错: 索引错误. 没办法,就安装了sql server2012客户端.但是还是报错,无法连上数据库服 ...
- vs.net 2005 C# WinForm GroupBOX 的BUG?尝试读取或写入受保护的内存。这通常指示其他内存已损坏
其实很久没有写程序了,国庆难得有空闲,写了个游戏辅助机器人,程序写好能用后本想把UI控件放到GroupBox里归下分类,美化下界面,结果一运行报“尝试读取或写入受保护的内存.这通常指示其他内存已损坏” ...
- System.AccessViolationException: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
系统debug时出现错误,System.AccessViolationException: 尝试读取或写入受保护的内存.这通常指示其他内存已损坏. Attempted to read or write ...
- C#尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
安装VS2013后,win7 + .net 4 + c#程序无法连接到SQL Server2000的实例 SQLServer2012在登录远程服务器实例时报错:尝试读取或写入受保护的内存. “尝试读取 ...
随机推荐
- JS获取当前完整的url地址以及参数的方法
javascript 获取当前 URL 参数的两种方法: //返回的是字符串形式的参数,例如:class_id=3&id=2& function getUrlArgStr(){ var ...
- 【华为云分享】MongoDB-系统时钟跳变引发的风波
目录 背景 一. 对 oplog 的影响 oplog 原理 二.主备倒换 小结 声明:本文同步发表于 MongoDB 中文社区,传送门:http://www.mongoing.com/archives ...
- 快速理解spark-on-k8s中的external-shuffle-service
[摘要] external-shuffle-service是Spark里面一个重要的特性,有了它后,executor可以在不同的stage阶段动态改变数量,大大提升集群资源利用率.但是这个特性当前在k ...
- Python使用psutil模块,做你的电脑管家
电脑管家 也许大家都有这样的感觉,优化完美的电脑系统,你把电脑借给一个电脑小白使用上几天,等你拿回来的时候会发现,开机各种慢,乱七八糟的软件装了一大堆.那么我们如何使用Python来获取电脑的相关数据 ...
- python使用mysql的一些坑
注意:如果你用的是python3.x,直接去看第四个问题 遇到的第一个问题 正常来说直接执行pip安装,就是可以的,但是MySQL-python偏偏比较独特 pip install MySQL-pyt ...
- 洛谷 题解 P4613 【[COCI2017-2018#5] Olivander】
我又双叒叕被包菜辣! P4613 [COCI2017-2018#5] Olivander 首先,不知道为什么这题无法提交翻译: 所以,我先放个翻译: 哈利波特在与伏地魔的战斗中损坏了他的魔杖.他决定在 ...
- node - 流 浅析
概念 流(stream)是 Node.js 中处理流式数据的抽象接口. stream 模块用于构建实现了流接口的对象. Node.js 提供了多种流对象. 例如,HTTP 服务器的请求和 proces ...
- Cesium专栏-大量gltf三维模型加载
Cesium 是一款面向三维地球和地图的,世界级的JavaScript开源产品.它提供了基于JavaScript语言的开发包,方便用户快速搭建一款零插件的虚拟地球Web应用,并在性能,精度,渲染质量以 ...
- (全国多校重现赛一)B-Ch's gifts
Mr. Cui is working off-campus and he misses his girl friend very much. After a whole night tossing a ...
- 自然语言处理(NLP) - 数学基础(1) - 排列组合
正如我在<自然语言处理(NLP) - 数学基础(1) - 总述>一文中所提到的NLP所关联的概率论(Probability Theory)知识点是如此的多, 饭只能一口一口地吃了, 我们先 ...