Сегфо в единстве от маршала.AllocHGlobal
В Unity у меня была система потока битов, для работы которой требовалось постоянное закрепление массивов. Я оптимизирую это, выделяя блок неуправляемой памяти и поддерживая указатели на нее, пока система жива. Примечание на случай, если это предложено; это не обязательно должна быть неуправляемая память, нет взаимодействия, но я хочу избежать дополнительной нагрузки на GC при использовании альтернативы закрепленного блока GCHandle.
Во всяком случае, я наделяю оберткой; AllocRaw::Alloc:
public static void* Alloc(int size) => Marshal.AllocHGlobal(size).ToPointer();
Я кэширую результат этого, чтобы позже вызвать Marshal.FreeHGlobal, и приведу его к байту *, который используется системой.
Как только я пишу на любой из этих указателей, Unity segfaults заявляет о нарушении прав доступа по адресу 0. Однако если я выполняю это вручную с помощью отладчика, все завершается нормально. Как только контроль возвращается в Unity, он падает.
У меня были проблемы с запуском Unity поверх неуправляемой памяти (когда он владеет памятью, но не должен записывать в нее), хотя и в другом проекте и без какого-либо ручного выделения. Возможно ли, что Unity каким-то образом ссылается на память, которую я выделяю, и запись в нее приводит к потере памяти?
Извиняюсь за широту этого вопроса, но я в растерянности, насколько отладка идет на этом этапе. Я ищу какие-либо предложения относительно возможности возникновения сбоя памяти и шагов, которые я мог бы предпринять (из управляемого кода, без точек останова данных), чтобы отладить это.
РЕДАКТИРОВАТЬ: Я должен также добавить, что это тестовый пример всего несколько сотен КБ, и выделение и освобождение без записи не вызывает проблем.