Установка для SDL_calloc значения NativeMemory.Alloc(nuint, nuint) приводит к повреждению памяти.C#

Место общения программистов C#
Ответить
Anonymous
 Установка для SDL_calloc значения NativeMemory.Alloc(nuint, nuint) приводит к повреждению памяти.

Сообщение Anonymous »

При использовании P/Invoke с SDL 3.4.0 (предварительно созданные двоичные файлы Win32-x64) мне было любопытно, какие различия, если таковые имеются, проявятся при использовании NativeMemory, а не встроенной реализации SDL.
У меня есть следующий импорт:

Код: Выделить всё

[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
);
И у меня есть следующая заглушка обратного вызова (поскольку NativeMethods.Alloc(nuint, nuint) не имеет атрибута UnmanagedCallersOnly):

Код: Выделить всё

[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);
}
Я включил проверки elementCount и elementSize, чтобы соответствовать документированному поведению SDL_calloc. У меня есть аналогичные заглушки для malloc, realloc и free.
Я устанавливаю функции памяти SDL перед вызовом SDL_Init:

Код: Выделить всё

NativeMethods.SDL_SetMemoryFunctions
(
&MallocCallback,
&CallocCallback,
&ReallocCallback,
&FreeCallback
);
Когда я заменяю SDL_calloc на CallocCallback, моя программа завершает работу с ошибкой ExecutionEngineException в, казалось бы, случайных точках во время SDL_Init (Windows 10, Visual Studio Community 2026, .NET 10, отладочная сборка, выполняемая в отладчике).
Иногда программа очень быстро происходит сбой, при этом выделяется всего несколько МБ памяти; в других случаях программа выделяет 2+ ГБ перед зависанием (и в конечном итоге сбоем). Проверка elementCount и elementSize не дает неожиданных результатов. SDL_Init(SDL_INIT_VIDEO) последовательно не завершается, если SDL_calloc назначен CallocCallback.
Я пытался опустить защиту для elementCount и elementSize и попробовал обернуть все это в try/, все бесполезно.
Если я использую SDL_GetOriginalMemoryFunctions, чтобы получить встроенный SDL_calloc перед вызовом SDL_SetMemoryFunctions, заменив все остальные функции кроме calloc (оставив это встроенным SDL_calloc), то всё (по-видимому) инициализируется плавно.
Я даже подтвердил, что MallocCallback, ReallocCallback и FreeCallback действительно вызываются, каждый из которых вызывает соответствующий метод NativeMemory. Только реализация calloc вызывает этот случайный сбой.
Я что-то не так делаю с этим конкретным методом, или есть какое-то исправление, которое я могу реализовать? Мне неясно, почему только эта одна функция памяти вызывает проблемы.
Кроме того, чтобы внести ясность: у меня нет особой причины использовать NativeMemory, это была просто проверка того, что все остальное было правильно подключено, чтобы иметь возможность (потенциально) реализовать другие распределители, если/когда это необходимо.

Подробнее здесь: https://stackoverflow.com/questions/798 ... mory-corru
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»