2014-02-28 2 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 может не принять IntPtr, который указывает на неуправляемый объект !!! Поэтому вопрос совершенно бессмыслен.

+0

@Medinoc, thx, где я могу найти документ, который вы только что упоминали? – SimonFisher

+0

@ Medinoc, я не думаю, что пример msdn действительно означает, что мы можем использовать только FromIntPtr с intptr, возвращаемым ToIntPtr. – SimonFisher

+1

В документе MSDN не говорится, что вы можете создать GCHandle из воздуха из случайного IntPtr, который даже не указывает на управляемый объект. В нем говорится, что вы можете конвертировать GCHandle в IntPtr и обратно в GCHandle для передачи его в качестве контекста через неуправляемые функции (которые по определению принимают только указатели или типы intptr_t). – Medinoc

ответ

3

MSDN от док не говорит, что вы можете создать GCHandle из воздуха из случайного IntPtr, который даже не указывает на управляемый объект. Он говорит, что вы можете преобразовать GCHandle в IntPtr и обратно в GCHandle с целью передачи его в качестве контекста через неуправляемые функции (которые по определению принимают только указатели или intptr_t -кака типы)

Как следствие, единственный вид из IntPtr Вы должны пройти до GCHandle::FromIntPtr() - это тот, который был возвращен GCHandle::ToIntPtr().

1

Метод FromIntPtr возвращает новую структуру GCHandle (value-type), созданную из дескриптора, в управляемый объект, а метод Alloc Выделяет дескриптор для указанного объекта.

Таким образом, вы должны вызвать Free() на GCHandle STRUCT только если вы получили его вызовом 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

Смежные вопросы