2014-02-28 46 views
1

我正在使用GCHandle :: FromIntPtr将非托管结构指针转换为托管对象引用,请参见msdn中的示例。以下是我的代码片段:我应该释放从GCHandle :: FromIntPtr返回的句柄吗?

GCHandle gch = GCHandle::FromIntPtr(IntPtr(someNativePtr)); 
MyManagedClass^ obj = static_cast<MyManagedClass^>(gch.Target); 

我的问题是我应该自由gch?

UPDATE: 有一个巨大的问题,在这个问题上,正如Medinoc在他的评论中提到:的GCHandle :: FromIntPtr可以接受一个I​​ntPtr指向非托管对象!所以这个问题完全没有意义。

+0

@Medinoc,thx,我在哪里可以找到刚刚提到的文档? – SimonFisher

+0

@ Medinoc,我不认为msdn的例子真的意味着我们只能使用FromIntPtr和ToIntPtr返回的intptr。 – SimonFisher

+1

MSDN文档并没有说你可以从一个随机的IntPtr中毫不费力地创建一个GCHandle,它甚至不指向一个托管对象。它说你可以将GCHandle转换为IntPtr并将其转换回GCHandle,以便通过非托管函数(通过定义只接受指针或intptr_t类型)将其作为上下文传递。 – Medinoc

回答

3

的MSDN文档并不是说你可以通过随机IntPtr无限制地创建一个GCHandle,它甚至不指向一个托管对象。它说,你可以一个GCHandle转换成IntPtr并返回到GCHandle为把它当作背景下,通过非托管功能(即通过定义只接受指针或intptr_t样类型)

因此,唯一的一种目的IntPtr你应该传给GCHandle::FromIntPtr()的是GCHandle::ToIntPtr()

1

FromIntPtr方法返回一个从句柄创建的新的GCHandle(value-type)结构,该句柄指向一个托管对象,而Alloc方法为指定的对象分配一个句柄。

所以,你需要呼吁的GCHandle免费()结构只有当你得到它通过调用的Alloc()不FromIntPtr()

参考:

http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.gchandle.alloc%28v=vs.110%29.aspx

+0

我不熟悉C++或C++/cli,但看起来你的回答是正确的。虽然GCHandle是非托管类型,但我们没有明确地分配它,所以我们没有责任释放它。这个解释是对的吗? – SimonFisher

+0

是的。我正是这个意思。 – Rami

+0

这里的文档绝对是细节。我建议阅读这篇文章,[关于GCHandles的真相](https://blogs.msdn.microsoft.com/clyon/2005/03/18/the-truth-about-gchandles/),以获取更多解释发生了什么事情。 tl; dr:看起来@Rami是正确的。 – kkahl

相关问题