2014-02-28 48 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

相關問題