欢迎使用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不到问题应用程序就结束了,所以一直没抓到出现问题的点。
阅读全文
0 0
原创粉丝点击