Нет, как только вы потеряете GCHandle, вы потеряете его навсегда. В сборщике мусора нет понятия «дескриптор ручки». Вы можете создать только новый GCHandle для объекта, он добавит дополнительную ссылку. Объект, на который ссылается этот потерянный дескриптор, будет постоянно указан, это утечка. Обратите внимание, что GCHandle является типом структуры.
Идея закрепления объектов в течение любого промежутка времени наносит ущерб вашей программе. Помимо того, что GC труднее обходить препятствия, он также мешает правильному уплотнению кучи. Это увеличивает вероятность промахов кеша, что очень дорого для современных ядер. Эти побочные эффекты могут продолжаться некоторое время.
Если вам нужна закрепленная память, выделите ее с помощью Marshal.AllocCoTaskMem (). Это также не позволяет создавать указатели на управляемые данные с непредсказуемым расположением памяти. Макет, который отличается в разных версиях JIT-компилятора и сильно зависит от объявления структуры или класса. Только Marshal.StructureToPtr () может дать вам твердые гарантии.