Сегфо в единстве от маршала.AllocHGlobal

В Unity у меня была система потока битов, для работы которой требовалось постоянное закрепление массивов. Я оптимизирую это, выделяя блок неуправляемой памяти и поддерживая указатели на нее, пока система жива. Примечание на случай, если это предложено; это не обязательно должна быть неуправляемая память, нет взаимодействия, но я хочу избежать дополнительной нагрузки на GC при использовании альтернативы закрепленного блока GCHandle.

Во всяком случае, я наделяю оберткой; AllocRaw::Alloc:

public static void* Alloc(int size) => Marshal.AllocHGlobal(size).ToPointer();

Я кэширую результат этого, чтобы позже вызвать Marshal.FreeHGlobal, и приведу его к байту *, который используется системой.

Как только я пишу на любой из этих указателей, Unity segfaults заявляет о нарушении прав доступа по адресу 0. Однако если я выполняю это вручную с помощью отладчика, все завершается нормально. Как только контроль возвращается в Unity, он падает.

У меня были проблемы с запуском Unity поверх неуправляемой памяти (когда он владеет памятью, но не должен записывать в нее), хотя и в другом проекте и без какого-либо ручного выделения. Возможно ли, что Unity каким-то образом ссылается на память, которую я выделяю, и запись в нее приводит к потере памяти?

Извиняюсь за широту этого вопроса, но я в растерянности, насколько отладка идет на этом этапе. Я ищу какие-либо предложения относительно возможности возникновения сбоя памяти и шагов, которые я мог бы предпринять (из управляемого кода, без точек останова данных), чтобы отладить это.

РЕДАКТИРОВАТЬ: Я должен также добавить, что это тестовый пример всего несколько сотен КБ, и выделение и освобождение без записи не вызывает проблем.

0 ответов

Другие вопросы по тегам