ArcEngine中出现“尝试读取或写入受保护的内存。这通常指示其他内存已损坏”报错 学习笔记

本文主要是介绍ArcEngine中出现“尝试读取或写入受保护的内存。这通常指示其他内存已损坏”报错 学习笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

ArcEngine开发中出现“尝试读取或写入受保护的内存。这通常指示其他内存已损坏”错误

在项目开发过程中,使用了要素的游标进行数据查询,在数据查询进行到一半的时候,系统报错“尝试读取或写入受保护的内存。这通常指示其他内存已损坏”,在网上搜了一下问题,基本都是说“循环多次打开对象,导致内存没有及时释放。”的原因,需要将COM对象释放掉。

问题:
这是我游标代码部分,在游标中我循环调用了“getValueByOtherFeatureClass”方法,于是在这里我猜测,是这个方法循环调用太多,导致对象没有及时释放导致的内存溢出。(因为getValueByOtherFeatureClass这个方法里面也用了游标Cursor,所以能基本确认是这个问题)
在这里插入图片描述
解决方法:

由于在getValueByOtherFeatureClass方法我也用到了游标,故我在方法中添加“Marshal.ReleaseComObject”用于释放对象。每次调用完getValueByOtherFeatureClass方法,我都将该方法中的“IFeatureCursor 、IFeature、ISpatialFilter ”三个对象释放掉。这样的话,每次调用getValueByOtherFeatureClass方法,之前创建的对象都释放掉了,故多次循环不会出现报错!
(本文仅为自己AE开发过程中的学习笔记,大佬勿喷)

强调:
Marshal.ReleaseComObject(pMatchDataFeatureCursor);
Marshal.ReleaseComObject(pMatchDataFeature);
Marshal.ReleaseComObject(pSpatialFilter);
是关键!!!!

private string getValueByOtherFeatureClass(IFeatureClass pMatchDataFeatureClass,string matchDataFiled, string transDataFiled, string matchValue){//①遍历要素数据 ==》pDataFeatureClass// 创建polyline空间查询器ISpatialFilter pSpatialFilter = new SpatialFilter();pSpatialFilter.WhereClause = matchDataFiled + "=" +"\'" + matchValue + "\'";//创建Feature要素游标,根据pSpatialFilter条件进行数据查询IFeatureCursor pMatchDataFeatureCursor = pMatchDataFeatureClass.Search(pSpatialFilter, true);IFeature pMatchDataFeature = pMatchDataFeatureCursor.NextFeature();while(pMatchDataFeature != null){int transDataIndex = pMatchDataFeature.Fields.FindField(transDataFiled);string transValue = pMatchDataFeature.Value[transDataIndex].ToString();//释放arcengine中的COM对象  ==及时处理COM对象,否则会报错!!!Marshal.ReleaseComObject(pMatchDataFeatureCursor);Marshal.ReleaseComObject(pMatchDataFeature);Marshal.ReleaseComObject(pSpatialFilter);return transValue;}//释放arcengine中的COM对象Marshal.ReleaseComObject(pMatchDataFeatureCursor);Marshal.ReleaseComObject(pSpatialFilter);return null;}

这篇关于ArcEngine中出现“尝试读取或写入受保护的内存。这通常指示其他内存已损坏”报错 学习笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1032859

相关文章

Linux下利用select实现串口数据读取过程

《Linux下利用select实现串口数据读取过程》文章介绍Linux中使用select、poll或epoll实现串口数据读取,通过I/O多路复用机制在数据到达时触发读取,避免持续轮询,示例代码展示设... 目录示例代码(使用select实现)代码解释总结在 linux 系统里,我们可以借助 select、

idea突然报错Malformed \uxxxx encoding问题及解决

《idea突然报错Malformeduxxxxencoding问题及解决》Maven项目在切换Git分支时报错,提示project元素为描述符根元素,解决方法:删除Maven仓库中的resolv... 目www.chinasem.cn录问题解决方式总结问题idea 上的 maven China编程项目突然报错,是

Python内存管理机制之垃圾回收与引用计数操作全过程

《Python内存管理机制之垃圾回收与引用计数操作全过程》SQLAlchemy是Python中最流行的ORM(对象关系映射)框架之一,它提供了高效且灵活的数据库操作方式,本文将介绍如何使用SQLAlc... 目录安装核心概念连接数据库定义数据模型创建数据库表基本CRUD操作创建数据读取数据更新数据删除数据查

C#实现SHP文件读取与地图显示的完整教程

《C#实现SHP文件读取与地图显示的完整教程》在地理信息系统(GIS)开发中,SHP文件是一种常见的矢量数据格式,本文将详细介绍如何使用C#读取SHP文件并实现地图显示功能,包括坐标转换、图形渲染、平... 目录概述功能特点核心代码解析1. 文件读取与初始化2. 坐标转换3. 图形绘制4. 地图交互功能缩放

java读取excel文件为base64实现方式

《java读取excel文件为base64实现方式》文章介绍使用ApachePOI和EasyExcel处理Excel文件并转换为Base64的方法,强调EasyExcel适合大文件且内存占用低,需注意... 目录使用 Apache POI 读取 Excel 并转换为 Base64使用 EasyExcel 处

linux查找java项目日志查找报错信息方式

《linux查找java项目日志查找报错信息方式》日志查找定位步骤:进入项目,用tail-f实时跟踪日志,tail-n1000查看末尾1000行,grep搜索关键词或时间,vim内精准查找并高亮定位,... 目录日志查找定位在当前文件里找到报错消息总结日志查找定位1.cd 进入项目2.正常日志 和错误日

k8s容器放开锁内存限制问题

《k8s容器放开锁内存限制问题》nccl-test容器运行mpirun时因NCCL_BUFFSIZE过大导致OOM,需通过修改docker服务配置文件,将LimitMEMLOCK设为infinity并... 目录问题问题确认放开容器max locked memory限制总结参考:https://Access

Redis实现高效内存管理的示例代码

《Redis实现高效内存管理的示例代码》Redis内存管理是其核心功能之一,为了高效地利用内存,Redis采用了多种技术和策略,如优化的数据结构、内存分配策略、内存回收、数据压缩等,下面就来详细的介绍... 目录1. 内存分配策略jemalloc 的使用2. 数据压缩和编码ziplist示例代码3. 优化的

解决升级JDK报错:module java.base does not“opens java.lang.reflect“to unnamed module问题

《解决升级JDK报错:modulejava.basedoesnot“opensjava.lang.reflect“tounnamedmodule问题》SpringBoot启动错误源于Jav... 目录问题描述原因分析解决方案总结问题描述启动sprintboot时报以下错误原因分析编程异js常是由Ja

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象