PinGCArrayAndGetDataAddress(Array, out ulong)
Pins a garbage-collected (GC) array and returns the address of its first element, ensuring the array's memory location remains fixed.
Read time 2 minutesLast updated 19 days ago
Definition
- Type: Method
- Namespace: Unity.Collections.LowLevel.Unsafe
- Assembly: UnityEngine.CoreModule
PinGCArrayAndGetDataAddress(Array, ulong)
public static void* PinGCArrayAndGetDataAddress(Array target, out ulong gcHandle)
Parameters
Returns
Type | Description |
|---|---|
| void* | A pointer to the first element of the pinned array. Use this pointer for direct memory access to the array elements. |
Remarks
The method pins a managed array in memory, preventing the garbage collector from relocating it. This is crucial when interfacing with native code or conducting low-level memory operations involving managed arrays. Use this method to obtain a stable pointer to array elements for performance-critical operations.
PinGCArrayAndGetDataAddressAfter pinning an array, release the GC handle using UnsafeUtility.ReleaseGCObject when the array no longer needs to be pinned to avoid resource leaks.
using UnityEngine;using Unity.Collections.LowLevel.Unsafe;using System;public class PinArrayExample : MonoBehaviour{ void Start() { int[] managedArray = { 1, 2, 3, 4, 5 }; // Pin the managed array and get the address of its first element unsafe { void* dataPtr = UnsafeUtility.PinGCArrayAndGetDataAddress(managedArray, out ulong gcHandle); Debug.Log($"Address of first element: {(IntPtr)dataPtr}"); // Manipulate the array data directly using the pointer int* intPtr = (int*)dataPtr; for (int i = 0; i < managedArray.Length; i++) { intPtr[i] *= 2; // Double each element in the array } // Verify changes by logging the updated array Debug.Log("Contents of managed array after manipulation:"); for (int i = 0; i < managedArray.Length; i++) { Debug.Log(managedArray[i]); // Expected output: 2, 4, 6, 8, 10 } // Release the GC handle once done UnsafeUtility.ReleaseGCObject(gcHandle); } // Confirm that the GC handle is released Debug.Log("GC handle released, managed array unpinned."); }}
Additional Resources: UnsafeUtility.PinGCArrayAndGetDataAddress.