欢迎使用CSDN-markdown编辑器
来源:互联网 发布:武汉淘宝西服店铺 编辑:程序博客网 时间:2024/06/16 08:23
有问题的代码:
public static byte[] HDLCToBytes(HDLC_STRUCT structObj)
{
int size = Marshal.SizeOf(structObj);
IntPtr structPtr = Marshal.AllocHGlobal(size);
try
{
byte[] bytes = new byte[size];
Marshal.StructureToPtr(structObj, structPtr, false);
Marshal.Copy(structPtr, bytes, 0, size);
return bytes;
}
finally
{
Marshal.FreeHGlobal(structPtr);
}
}
结构体定义
[StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.None, Pack = 1)]
public struct HDLC_STRUCT
{
public byte code;
public byte lens;
public byte crc_lo;
public byte crc_hi;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
public byte[] data;
}
结构体的长度从定义上是132,但实际使用时,data部分不需要全部的128byte,所以在结构体转成字节数组时长度定义成所需要的长度,在分配内存时申请了需要的字节长度,远短于结构体的定义长度,在将结构体复制到非托管内存中时发生了内存泄漏。
public static byte[] HDLCToBytes(HDLC_STRUCT structObj)
{
int byte_size = structObj.lens + 4;
int struct_size = Marshal.SizeOf(structObj);
IntPtr structPtr = Marshal.AllocHGlobal(struct_size);
try
{
byte[] bytes = new byte[byte_size];
Marshal.StructureToPtr(structObj, structPtr, false);
Marshal.Copy(structPtr, bytes, 0, byte_size);
return bytes;
}
finally
{
Marshal.FreeHGlobal(structPtr);
}
}
将输出的字节数组和申请非托管内存的长度区分开,避免出现相关问题。 解决完之后再看其实是一个很简单的小问题,由于Catch不到问题应用程序就结束了,所以一直没抓到出现问题的点。
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- WPS表格2013怎么进行数据合并计算将多个区域进行合并计算
- [小记]在eclipse中配置jdk源码 解决jdk source not found
- 初识docker—容器连接
- 树,满二叉树,完全二叉树,堆总结
- linux压缩解压命令总结2
- 欢迎使用CSDN-markdown编辑器
- 继承自PagerAdapter的适配器
- 完成系统登录程序,从命令行输入用户名和密码,如果没有输入用户名和密码,则提示输入用户名和密码;如果输入了用户名但是没有输入密码,则提示用户输入密码,然后判断用户名是否是mldn,密码是否是hello,
- 数据结构(第二版)(王卫东) 小组作业之病毒感染检测
- Java String和StringBuilder常用方法
- boostrap模态框二次弹出清空原有内容
- APP带第三方微博、微信、QQ等登录注册的登录注册流程分解
- redis连接失败 Connection refused: connect
- 用 Go 构建一个区块链 -- Part 5: 地址