Что на самом деле делает ваш менеджер статической памяти? Если это не делает что-то небезопасное (P / Invoke, небезопасный код), то поведение, которое вы видите, является ошибкой в вашей программе, а не из-за поведения CLR.
Во-вторых, что вы подразумеваете под «указателем» в отношении связей между структурами? Вы буквально имеете в виду небезопасный указатель KdTree *? Не делай этого. Вместо этого используйте индекс в массиве. Поскольку я ожидаю, что все узлы для одного дерева хранятся в одном и том же массиве, вам не понадобится отдельная ссылка на массив. Подойдет только один индекс.
Наконец, если вы действительно должны использовать указатели KdTree *, тогда ваш менеджер статической памяти должен выделить большой блок, используя, например, Marshal.AllocHGlobal или другой неуправляемый источник памяти; он должен оба обрабатывать этот большой блок как массив KdTree (то есть индексировать KdTree * C-стиль) и , он должен перераспределять узлы из этого массива путем увеличения «свободного» указателя.
Если вам когда-нибудь понадобится изменить размер этого массива, то вам, конечно, нужно обновить все указатели.
Основной урок здесь заключается в том, что небезопасные указатели и управляемая память не смешивают вне «фиксированных» блоков, которые, конечно, имеют сходство кадров стека (т.е. когда функция возвращается, закрепленное поведение исчезает) , Существует способ закрепления произвольных объектов, таких как ваш массив, с помощью GCHandle.Alloc (yourArray, GCHandleType.Pinned), но вы почти наверняка не хотите идти по этому пути.
Вы получите более разумные ответы, если опишите более подробно, что делаете.