Marshal.AllocHGlobal 内存泄漏

pengwu666 东莞市卓品科技有限公司 高级软件工程师  2016-01-26 01:31:22
.net 4.0 中使用
Marshal.AllocHGlobal 分配的内存
Marshal.StructureToPtr(*, *, False) 封送参数,根据说明设置false会内存泄漏

我需要使用后 Marshal.FreeHGlobal 一下吗。还是说不用管。
...全文
350 4 打赏 收藏 举报
写回复
4 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
九仞之行 2020-02-13
引用 2 楼 IE11下面经常卡到爆 的回复:
举个例子吧 struct1 { int abc; struct2 s2; } struct2 { int x; } StructureToPtr(struct1), 不会,都在栈上 struct1 { struct2 *p2; } Marshal.FreeHGlobal()能释放struct1,一个指针宽度的内存,但p2指向的struct2就泄露了
虽然是几年前的帖子了,但是还是想感谢您的解释给了我思路。。。 高中生一枚,编程问题都靠度娘。。但是度娘不太靠谱。。难得遇到让人眼前一亮、 顿悟的解释
  • 打赏
  • 举报
回复
Poopaye 2016-01-26
这种成对出现的接口当然要一起调用
  • 打赏
  • 举报
回复
举个例子吧 struct1 { int abc; struct2 s2; } struct2 { int x; } StructureToPtr(struct1), 不会,都在栈上 struct1 { struct2 *p2; } Marshal.FreeHGlobal()能释放struct1,一个指针宽度的内存,但p2指向的struct2就泄露了
  • 打赏
  • 举报
回复
看了一下方法说明,传true时CLR会在调用StructureToPtr()之前先调用DestroyStructure(),而后一个方法注释 Frees all substructures pointed to by the specified unmanaged memory block. 释放指定非托管内存块所指向的所有子结构体 连起来看就是,当StructureToPtr()传入的结构体有引用指针型的子(包括孙子)结构体时,就会发生内存泄露 反之,如果只是基础类型,char,int之类的因为都在栈上,则不会泄露 调用Marshal.FreeHGlobal()是必要的,因为它能释放最顶层的结构体的内存=sizeof(structuretType),但是那些指针型的子结构体成员所占的内存就无能为力了,因为父结构销毁,子结构体成员的指针(在栈上)已经不知道了,自然无从释放
  • 打赏
  • 举报
回复
相关推荐
发帖
C#
加入

10.7w+

社区成员

.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
申请成为版主
帖子事件
创建了帖子
2016-01-26 01:31
社区公告

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