我应该释放从GCHandle :: FromIntPtr返回的句柄吗?

3

我正在使用GCHandle::FromIntPtr将非托管结构指针转换为托管对象引用,参考了msdn中的示例。以下是我的代码片段:

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

我的问题是:我应该释放gch吗?
更新: 这个问题存在一个巨大的问题,就像Medinoc在他的评论中提到的那样:GCHandle::FromIntPtr不能接受指向非托管对象的IntPtr!!!所以这个问题完全没有意义。

@Medinoc,谢谢,您刚才提到的文档在哪里可以找到? - SimonFisher
@Medinoc,我认为MSDN的例子并不意味着我们只能使用ToIntPtr返回的intptr来使用FromIntPtr。 - SimonFisher
1
MSDN文档并没有说您可以从一个不指向托管对象的随机IntPtr中轻易地创建GCHandle。它说您可以将GCHandle转换为IntPtr,然后再转换回GCHandle,以便通过未管理的函数(仅接受指针或intptr_t类型)将其作为上下文传递。 - Medinoc
@Medinoc,MSDN将其唯一参数解释为“指向要从中创建GCHandle对象的托管对象的IntPtr句柄。”因此,我认为只要它指向托管对象,该函数就可以接受任何IntPtr。我找不到任何信息表明它只能接受从GCHandle转换而来的IntPtr。顺便说一下:我是C++的新手。 - SimonFisher
你自己说了:“一个指向托管对象的IntPtr 句柄”。如果我没记错的话,你不能直接将SomeClass^托管句柄强制转换为IntPtr,这就只能使用GCHandle类来创建一个。 - Medinoc
@Medinoc,你真的打了我一拳。确实,我错了,你是正确的。如果你想把评论变成回复,我很乐意将其标记为答案。 - SimonFisher
2个回答

4
MSDN文档没有说明可以从一个随意的IntPtr中创建一个GCHandle,即使这个IntPtr并不指向托管对象。它说你可以将一个GCHandle转换为IntPtr,然后再将其转换回GCHandle,以便通过非托管函数(只接受指针或intptr_t等类型)作为上下文传递。
因此,你应该只传递由GCHandle::ToIntPtr()返回的IntPtr给GCHandle::FromIntPtr()。

3

我不熟悉C++或C++/CLI,但是看起来你的答案是正确的。虽然GCHandle是未托管类型,但我们没有显式分配它,因此我们没有责任释放它。这个解释正确吗? - SimonFisher
这里的文档细节确实很少。我建议阅读这篇文章《关于GCHandles的真相》(https://blogs.msdn.microsoft.com/clyon/2005/03/18/the-truth-about-gchandles/),以获得更多关于正在发生的事情的解释。简而言之:@Rami是正确的。 - kkahl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接