Показать сообщение отдельно

  #5  
Старый 06.04.2010, 03:56
gribodemon
Новичок
Регистрация: 07.06.2009
Сообщений: 4
Провел на форуме:
39074

Репутация: 9
По умолчанию

ALSO

А так же, в этом коде никак не обрабатывается ситуация, если мы хотим освободить память по invalid-указателю.
В реальной программе, с функцией free это привидёт к исключению. Поэтому, я рекомендую добавить

Код:
__asm int 3
В конец функции 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


Кто знает более лаконичное решение?

Последний раз редактировалось gribodemon; 06.04.2010 в 04:24..