UnsafeUtility.PinGCObjectAndGetAddress
Declaration
public static void* PinGCObjectAndGetAddress(object target, out ulong gcHandle);Параметры
| Параметр | Описание |
|---|---|
| Цель | Объект для прикрепления. Это должен быть управляемый объект, расположение памяти которого должно оставаться фиксированным во время сбора мусора. |
| gcHandle | Обработчик, связанный с прикрепленным объектом. Правильно управляйте этим обработчиком, чтобы обеспечить его освобождение, когда он больше не требуется. |
Возвращаемое значение
void* Указатель на расположение в памяти прикрепленного объекта. Используйте этот указатель для прямого доступа к данным объекта в памяти.
Описание
Прикрепляет объект к памяти, обеспечивая его сохранение в фиксированном месте памяти во время сбора мусора.
Метод PinGCObjectAndGetAddress прикрепляет управляемый объект, предотвращая его перемещение сборщиком мусора. Это особенно полезно, когда необходимо поддерживать стабильные адреса памяти при взаимодействии с неуправляемым кодом или выполнении низкоуровневых операций памяти. Убедитесь, что вы освободили обработчик GC с помощью UnsafeUtility.ReleaseGCObject, чтобы предотвратить утечку ресурсов.
using UnityEngine; using Unity.Collections.LowLevel.Unsafe;
public class PinGCObjectBoxedStructExample : MonoBehaviour { private struct MyStruct { public int value; }
void Start() { // Create and box a struct object myObject = new MyStruct { value = 20 };
// Pin the boxed struct and get the address of its memory location unsafe { void* dataPtr = UnsafeUtility.PinGCObjectAndGetAddress(myObject, out ulong gcHandle);
// Move the pointer to skip the object header to get to the struct value int objectHeaderSize = UnsafeUtility.SizeOf<long>() * 2; // Typical object header size in bytes int* valuePtr = (int*)((byte*)dataPtr + objectHeaderSize);
// Log the initial value Debug.Log($"Initial struct value: {*valuePtr}"); // Expected output: 20
// Modify the value through the pointer *valuePtr = 40;
// Release the GC handle after manipulation UnsafeUtility.ReleaseGCObject(gcHandle); }
// Re-cast the object to a struct to verify modifications MyStruct modifiedStruct = (MyStruct)myObject; Debug.Log($"Modified struct value: {modifiedStruct.value}"); // Expected output: 40
// Confirm the GC handle is released Debug.Log("GC handle released, boxed struct unpinned."); } }
Дополнительные ресурсы: UnsafeUtility.PinGCArrayAndGetAddress.