У меня есть следующий импорт:
Код: Выделить всё
[LibraryImport("SDL3")]
[UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
[return: MarshalAs(UnmanagedType.U1)]
public static partial bool SDL_SetMemoryFunctions
(
delegate* unmanaged[Cdecl] malloc,
delegate* unmanaged[Cdecl] calloc,
delegate* unmanaged[Cdecl] realloc,
delegate* unmanaged[Cdecl] free
);
Код: Выделить всё
[UnmanagedCallersOnly(CallConvs = [typeof(CallConvCdecl)])]
private static void* CallocCallback(nuint elementCount, nuint elementSize)
{
if (elementCount == 0U)
{
elementCount = 1U;
}
if (elementSize == 0U)
{
elementSize = 1U;
}
return NativeMemory.Alloc(elementCount, elementSize);
}
Я устанавливаю функции памяти SDL перед вызовом SDL_Init:
Код: Выделить всё
NativeMethods.SDL_SetMemoryFunctions
(
&MallocCallback,
&CallocCallback,
&ReallocCallback,
&FreeCallback
);
Иногда программа очень быстро происходит сбой, при этом выделяется всего несколько МБ памяти; в других случаях программа выделяет 2+ ГБ перед зависанием (и в конечном итоге сбоем). Проверка elementCount и elementSize не дает неожиданных результатов. SDL_Init(SDL_INIT_VIDEO) последовательно не завершается, если SDL_calloc назначен CallocCallback.
Я пытался опустить защиту для elementCount и elementSize и попробовал обернуть все это в try/
Код: Выделить всё
catchЕсли я использую SDL_GetOriginalMemoryFunctions, чтобы получить встроенный SDL_calloc перед вызовом SDL_SetMemoryFunctions, заменив все остальные функции кроме calloc (оставив это встроенным SDL_calloc), то всё (по-видимому) инициализируется плавно.
Я даже подтвердил, что MallocCallback, ReallocCallback и FreeCallback действительно вызываются, каждый из которых вызывает соответствующий метод NativeMemory. Только реализация calloc вызывает этот случайный сбой.
Я что-то не так делаю с этим конкретным методом, или есть какое-то исправление, которое я могу реализовать? Мне неясно, почему только эта одна функция памяти вызывает проблемы.
Кроме того, чтобы внести ясность: у меня нет особой причины использовать NativeMemory, это была просто проверка того, что все остальное было правильно подключено, чтобы иметь возможность (потенциально) реализовать другие распределители, если/когда это необходимо.
Подробнее здесь: https://stackoverflow.com/questions/798 ... mory-corru
Мобильная версия