Иногда случаются проезды по памяти при использовании getMem/freeMem.
Как их искать?
VirtualAlloc/VirtualProtect далеко не всегда помогают. В силу их специфики.
Как быть?
Придумал вот что:
Const
Filler : array [0..1] of integer = (high(integer), high(integer) -1);
SafeGetMem: Pointer
Var allocated: pointer;
GetMem(result, SizeOf(pointer) + sizeOf(Filler));
GetMem(allocated, aSize + SizeOf(pointer));
Move(result^, result^, sizeOf(result));
Move(result + SizeOf(result)^, Filler, SizeOf(filler));
Move(allocated^, result^, SizeOf(result));
Result := allocated + SizeOf(result);
А в safeFreeMem - проверяем все инварианты.
Как их искать?
VirtualAlloc/VirtualProtect далеко не всегда помогают. В силу их специфики.
Как быть?
Придумал вот что:
Const
Filler : array [0..1] of integer = (high(integer), high(integer) -1);
SafeGetMem: Pointer
Var allocated: pointer;
GetMem(result, SizeOf(pointer) + sizeOf(Filler));
GetMem(allocated, aSize + SizeOf(pointer));
Move(result^, result^, sizeOf(result));
Move(result + SizeOf(result)^, Filler, SizeOf(filler));
Move(allocated^, result^, SizeOf(result));
Result := allocated + SizeOf(result);
А в safeFreeMem - проверяем все инварианты.
Комментариев нет:
Отправить комментарий