我使用GCHandle :: FromIntPtr将非托管结构指针转换为托管对象引用,请参阅msdn中的示例。以下是我的代码段:
GCHandle gch = GCHandle::FromIntPtr(IntPtr(someNativePtr));
MyManagedClass^ obj = static_cast<MyManagedClass^>(gch.Target);
我的问题是我应该免费gch吗?
更新 正如Medinoc在评论中提到的那样,这个问题存在一个巨大的问题:GCHandle :: FromIntPtr可以不接受一个指向非托管对象的IntPtr!所以问题完全没有意义。
答案 0 :(得分:3)
MSDN文档并没有说你可以从一个甚至没有指向托管对象的随机IntPtr
中凭空创建一个GCHandle。它表示您可以将GCHandle
转换为IntPtr
并转换回GCHandle
,以便通过非托管函数将其作为上下文传递(根据定义,它只接受指针或{{1}类似的类型)
因此,您应该传递给intptr_t
的{{1}}唯一类型是IntPtr
返回的{。}}。
答案 1 :(得分:1)
FromIntPtr方法返回从句柄创建到托管对象的新GCHandle(值类型)结构,而Alloc方法为指定对象分配句柄。
因此,只有通过调用Alloc()而不是FromIntPtr()
,才需要在GCHandle结构上调用Free()参考: