Могу ли я получить GCHandles для закрепленного объекта от объекта? - PullRequest
4 голосов
/ 10 ноября 2010

Я прикрепляю объект к .NET и получаю GCHandle. Я хочу пропустить большую часть этих GCHandle и забыть о них (поэтому объекты продолжают закрепляться). Позже, для нескольких объектов я хочу открепить их. На данный момент у меня есть только объект (или адрес объекта).

Кажется, что каждый вызов закрепления GCHandle возвращает новый GCHandle. GCHandle.ToIntPtr и GCHandle.FromIntPtr показывают, что родные целые числа эквивалентны этим GCHandles.

Возможно ли получить GCHandle (s) от объекта или от AddrOfPinnedObject?

Ответы [ 2 ]

3 голосов
/ 10 ноября 2010

Нет, как только вы потеряете GCHandle, вы потеряете его навсегда. В сборщике мусора нет понятия «дескриптор ручки». Вы можете создать только новый GCHandle для объекта, он добавит дополнительную ссылку. Объект, на который ссылается этот потерянный дескриптор, будет постоянно указан, это утечка. Обратите внимание, что GCHandle является типом структуры.

Идея закрепления объектов в течение любого промежутка времени наносит ущерб вашей программе. Помимо того, что GC труднее обходить препятствия, он также мешает правильному уплотнению кучи. Это увеличивает вероятность промахов кеша, что очень дорого для современных ядер. Эти побочные эффекты могут продолжаться некоторое время.

Если вам нужна закрепленная память, выделите ее с помощью Marshal.AllocCoTaskMem (). Это также не позволяет создавать указатели на управляемые данные с непредсказуемым расположением памяти. Макет, который отличается в разных версиях JIT-компилятора и сильно зависит от объявления структуры или класса. Только Marshal.StructureToPtr () может дать вам твердые гарантии.

0 голосов
/ 10 ноября 2010

Для тех, кого вам нужно освободить, сохраните GCHandles и используйте Free.GCHandle знает об объекте, а не наоборот.

Также не очень хорошо, что вы хотите держать объекты закрепленными.Я надеюсь, вы понимаете, что будете препятствовать правильной работе GC.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...