Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 我应该释放从GCHandle::fromtptr返回的句柄吗?_.net_Visual C++_C++ Cli - Fatal编程技术网

.net 我应该释放从GCHandle::fromtptr返回的句柄吗?

.net 我应该释放从GCHandle::fromtptr返回的句柄吗?,.net,visual-c++,c++-cli,.net,Visual C++,C++ Cli,我使用GCHandle::FromIntPtr将非托管结构指针转换为托管对象引用,请参见中的示例。下面是我的代码片段: GCHandle gch = GCHandle::FromIntPtr(IntPtr(someNativePtr)); MyManagedClass^ obj = static_cast<MyManagedClass^>(gch.Target); GCHandle gch=GCHandle::fromtptr(IntPtr(someNativePtr)); MyM

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

GCHandle gch = GCHandle::FromIntPtr(IntPtr(someNativePtr));
MyManagedClass^ obj = static_cast<MyManagedClass^>(gch.Target);
GCHandle gch=GCHandle::fromtptr(IntPtr(someNativePtr));
MyManagedClass ^obj=静态强制转换(gch.Target);
我的问题是我应该释放gch吗

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

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

因此,只有通过调用Alloc()而不是intptr()获得GCHandle结构时,才需要对其调用Free()

参考:


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


因此,您应该传递给
GCHandle::FromIntPtr()
IntPtr的唯一类型是
GCHandle::ToIntPtr()

@Medinoc,thx,在哪里可以找到您刚才提到的文档?@Medinoc,我不认为msdn示例真的意味着我们只能使用FromIntPtr和ToIntPtr返回的intptr。msdn文档并没有说您可以从一个甚至不指向托管对象的随机intptr中凭空创建GCHandle。它表示可以将GCHandle转换为IntPtr并返回到GCHandle,以便通过非托管函数(根据定义,这些函数只接受指针或类似IntPtr的类型)将其作为上下文传递。@Medinoc,MSDN将其唯一参数解释为“用于创建GCHandle对象的托管对象的IntPtr句柄”所以我认为函数可以接受任何IntPtr,只要它指向一个托管对象。我找不到任何信息表明它只能接受从GCHandle转换而来的IntPtr。仅供参考:我是c++的新手,你自己说过:“托管对象的IntPtr句柄”。Irc不能直接将<代码> SomeClass ^ < /Cube托管句柄转换成一个ItpTR,这将使GCHANDLE类成为唯一的创建方法。我不熟悉C++或C++/CLI,但看起来您的答案是正确的。虽然GCHandle是非托管类型,但我们没有显式地分配它,所以我们没有责任释放它。这个解释正确吗?这里的文档非常详细。我建议阅读这篇文章,对正在发生的事情有更多的解释。tl;dr:看来@Rami是正确的。