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

时间:2014-02-28 09:43:02

标签: .net visual-c++ c++-cli

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

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

我的问题是我应该免费gch吗?

更新   正如Medinoc在评论中提到的那样,这个问题存在一个巨大的问题:GCHandle :: FromIntPtr可以接受一个指向非托管对象的IntPtr!所以问题完全没有意义。

2 个答案:

答案 0 :(得分:3)

MSDN文档并没有说你可以从一个甚至没有指向托管对象的随机IntPtr中凭空创建一个GCHandle。它表示您可以将GCHandle转换为IntPtr并转换回GCHandle,以便通过非托管函数将其作为上下文传递(根据定义,它只接受指针或{{1}类似的类型)

因此,您应该传递给intptr_t的{​​{1}}唯一类型是IntPtr返回的{。}}。

答案 1 :(得分:1)

FromIntPtr方法返回从句柄创建到托管对象的新GCHandle(值类型)结构,而Alloc方法为指定对象分配句柄。

因此,只有通过调用Alloc()而不是FromIntPtr()

,才需要在GCHandle结构上调用Free()

参考:

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