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在登录远程服务器实例时报错:尝试读取或写入受保护的内存. “尝试读取 ...
随机推荐
- 在华为云ECS上手工通过Docker部署tomcat
本文介绍了如何在华为云上ECS上手工通过Docker部署tomcat,并提供了Docker常用操作 一.环境准备 ECS:操作系统版本: CentOS Linux release 7.6.181 ...
- Python基础班学习笔记
本博客采用思维导图式笔记,所有思维导图均为本人亲手所画.因为本人也是初次学习Python语言所以有些知识点可能不太全. 基础班第一天学习笔记:链接 基础班第二天学习笔记:链接 基础班第三天学习笔记:链 ...
- 二分查找-Java版
/** * * 二分查找算法 * * * * @param srcArray 有序数组 * * @param target 查找元素 * * @return srcArray数组下标,没找到返回-1 ...
- luogu P3152 正整数序列
题目描述 kkk制造了一个序列,这个序列里的数全是由正整数构成的.你别认为她的数列很神奇--其实就是1, 2, -, n而已.当然,n是给定的.kkk的同学lzn认为0是一个好数字(看上去很饱满有木有 ...
- 使用@media实现移动端使用@2x,@3x切换
/*dpr比值为1的css代码 */ div{ width:300px; height:200px; background:url(img/button@1x.png) ; } /* dpr比值为 ...
- Xcode 10 Error: Multiple commands produce
目录 Xcode 9.4.1运行react-native 可以,但是在Xcode 10运行报错,报错信息如下: 解决方法 1. 选择 File > Project Settings (或者 Fi ...
- 支付宝支付功能(使用支付宝sdk)
1.准备参数 新建一个公共参数配置类NewAlipayconfig (可将参数存放到config配置文件中读取) public class NewAlipayconfi ...
- 【Leetcode 做题学算法周刊】第六期
首发于微信公众号<前端成长记>,写于 2019.12.15 背景 本文记录刷题过程中的整个思考过程,以供参考.主要内容涵盖: 题目分析设想 编写代码验证 查阅他人解法 思考总结 目录 11 ...
- Linux中Postfix反病毒和垃圾邮件(十)
amavisd-new amavisd-new呼叫器是一个连接MTA和内容检测工具(诸如病毒扫描工具和SpamAssassin)的高性能接口程序,使用perl语言写成.它一般通过SMTP.ESMTP或 ...
- HTML中用AJAX方式把数据存储到浏览器中并取出
把对象只有转成字符串形式才可以存入,取出则是把字符串转成对象