ALSO
А так же, в этом коде никак не обрабатывается ситуация, если мы хотим освободить память по invalid-указателю.
В реальной программе, с функцией free это привидёт к исключению. Поэтому, я рекомендую добавить
В конец функции
FreeOverflowGuardedBuffer
P.S.:
Наверно вы зададите вопрос - как это вообще возможно - попытаться освободить память по неверному указателю ?
Если вы используете замечательный код TC -
TransferProgramEx, то эта ошибка может возникнуть. Будьте уверены.
Типа:
Код:
PBYTE gl_pBuffer = NULL;
...
void f()
{
if (gl_pBuffer) delete[] gl_pBuffer;
gl_pBuffer = new BYTE[100];
}
Что произойдёт, если вы вызовите неск. раз
f(), затем
FreeOverflowGuardedBuffer(), и снова попытаетесь вызвать
f(), будучи в коде уже другого процесса? Хехе. =)
А как решить эту проблему, не прибегая к полному отказу от оператора delete в функции типа
f() ?
Я так понимаю, нужно во временном указателе, до вызова
TransferProgramEx запомнить адрес на gl_pBuffer, затем обнулить gl_pBuffer, потом вызвать
TransferProgramEx, после её вызова, восстановить gl_pBuffer.
Ну, примерно таким образом это выглядит для случая с блоком по выявлению ошибок памяти ( дополнительный массив структур __allocs_bck & модифицированный код функции
TransferProgramEx) :
Код:
struct __allocation {
void* mem;
int len;
char guard_type;
} __allocs [ALLOC_SIZE], __allocs_bck [ALLOC_SIZE];
Код:
// move memory
#ifdef _DEBUGLITE
CopyMemory(__allocs_bck, __allocs, sizeof(__allocs));
ZeroMemory(__allocs, sizeof(__allocs));
#endif
__CopyMemoryAcrossProcesses( hProcess, (char*) hModule, (char*) Allocated );
#ifdef _DEBUGLITE
CopyMemory(__allocs, __allocs_bck, sizeof(__allocs));
ZeroMemory(__allocs_bck, sizeof(__allocs));
#endif
Кто знает более лаконичное решение?