记录我遇到的一次AccessViolationException异常

记录我遇到的一次AccessViolationException异常

问题描述

开发环境为win10+vs2019+net452,在win7+net452运行环境下,遇到根据结构体大小【Marshal.SizeOf(typeof(结构体))】分配内存【Marshal.AllocHGlobal(size)】,然后写入分配内存【Marshal.StructureToPtr(结构体, intPtr, true)】异常,try - catch 不能捕获,程序崩溃,在事件查看器中看到异常为AccessViolationException。

问题原因

从异常上理解,应该是分配的内存不够,导致写入对象越界。但是为什么根据结构体大小分配的会内存不够呢,对内存分配机制不了解,如有大神了解告知,不胜感激。
小的结构体不会有此异常,我遇到的报此异常的结构体,获取占用大小超过150K。
参考了这篇文章:https://www.cnblogs.com/yilang/p/11976576.html

解决办法

方法1:将运行框架升级到.net4.8,其他不做任何改动,问题自己消失【我是.net4.5.2框架开发的,其他的未测试】。
方法2:加大分配内存,我直接对分配的内存增加3倍【Marshal.AllocHGlobal(size * 3)】,问题消失。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值