C# Marshal类的中关于内存资源的释放。求解答!

sjjihdx 2011-07-20 04:23:24
/// <summary>
/// 转换成字节数组
/// </summary>
/// <returns></returns>
public byte[] ToBytes()
{
byte[] bytes = new byte[DATA_LENTH];
IntPtr pBuf = Marshal.UnsafeAddrOfPinnedArrayElement(bytes,0);
Marshal.StructureToPtr(this,pBuf,true);
return bytes;
}
------------------
如以上函数,可实现将自身对象序列化,但其使用到了非托管的东西,关于这方面的内存释放问题,我不是很懂。
就以上例子而言,是先声明和实例化一个指定长度的数组(这个我晓得它是托管的资源),然后通过Marshal.UnsafeAddrOfPinnedArrayElement获得这个数组在内存中的首地址,再然后将自身对象this移动到该地址,最后返回该数组。数组占用的资源在调用该函数的地方使用后会自动释放,可之前用了Marshal.UnsafeAddrOfPinnedArrayElement获得了首地址,而且还用到了 Marshal.StructureToPtr(将数据从托管对象封送到非托管内存块),那这些资源会自动释放吗?如果不会,那该怎么释放呢?
...全文
1785 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
sdl2005lyx 2011-07-27
  • 打赏
  • 举报
回复 1
给你个完整例子:
public static byte[] StructToBytes(object structObj)
{
//得到结构体的大小
int size = Marshal.SizeOf(structObj);
//创建byte数组
byte[] bytes = new byte[size];
//分配结构体大小的内存空间
IntPtr structPtr = Marshal.AllocHGlobal(size);
//将结构体拷到分配好的内存空间
Marshal.StructureToPtr(structObj, structPtr, false);
//从内存空间拷到byte数组
Marshal.Copy(structPtr, bytes, 0, size);
//释放内存空间
Marshal.FreeHGlobal(structPtr);
//返回byte数组
return bytes;
}
sjjihdx 2011-07-27
  • 打赏
  • 举报
回复
怎么没人啊

111,092

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧