Marshal.PtrToStructure问题

ZpSoft_wlp 2011-10-21 03:30:43
将非托管内存封装成托管对象,中间的实现过程会拷贝吗?
...全文
444 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ZpSoft_wlp 2011-10-21
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 gomoku 的回复:]

其实这样想,CLR是如何确保托管内存安全的?如果PtrToStructure没有拷贝的发生,
托管对象被回收了是否会破坏非托管内存?释放非托管内存是否会影响托管对象?

比如下面代码(查询远程桌面信息),WTSFreeMemory释放了由WTSEnumerateSessions负责准备的内存(记住托管世界并不知道该调用具体做了什么),如果没有拷贝,托管对象sessionInfo不就被破坏了……
[/Quote]

嗯~ 有道理,给分了!
gomoku 2011-10-21
  • 打赏
  • 举报
回复
其实这样想,CLR是如何确保托管内存安全的?如果PtrToStructure没有拷贝的发生,
托管对象被回收了是否会破坏非托管内存?释放非托管内存是否会影响托管对象?

比如下面代码(查询远程桌面信息),WTSFreeMemory释放了由WTSEnumerateSessions负责准备的内存(记住托管世界并不知道该调用具体做了什么),如果没有拷贝,托管对象sessionInfo不就被破坏了?

IntPtr pData;
bool = WTSEnumerateSessions(..., out pData,...);
SESSION_INFO sessionInfo = (SESSION_INFO)Marshal.PtrToStructure(pData + 0, ...);
WTSFreeMemory(pData);

int sessionId = sessionInfo.SessionId;
q_tianya 2011-10-21
  • 打赏
  • 举报
回复
a structure, when required to be serialized, must be decorated with the StructLayoutAttribute.

For example:

IntPtr valueArr = Marshal.AllocCoTaskMem(1028 * Marshal.SizeOf(typeof(int)));
Marshal.Copy(bList, 0, valueArr, 1028);

....

Marshal.FreeCoTaskMem(valueArr);




ZpSoft_wlp 2011-10-21
  • 打赏
  • 举报
回复
等待解答。。。
ZpSoft_wlp 2011-10-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 stonespace 的回复:]

程序不会拷贝,指针引用都不会拷贝,只做浅层拷贝,
[/Quote]

那楼上的意思是将内存从非托管标记为托管就完了?
但是StructureToPtr就需要先Alloc一块新的非托管内存才能转。难道一个拷贝一个不拷贝?
stonespace 2011-10-21
  • 打赏
  • 举报
回复
程序不会拷贝,指针引用都不会拷贝,只做浅层拷贝,
gomoku 2011-10-21
  • 打赏
  • 举报
回复
会。





.
ZpSoft_wlp 2011-10-21
  • 打赏
  • 举报
回复
我指内存拷贝

110,618

社区成员

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

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

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