Возможная утечка памяти? - PullRequest
0 голосов
/ 14 сентября 2011

У меня есть следующий код:

void customHandleException  (_EXCEPTION_POINTERS* ExceptionInfo)
{
      char* x = (char*)ExceptionInfo->ExceptionRecord->ExceptionInformation[0];
      delete[] x;
}


void foo()
{
   char* x = new char[ 256 ];
   ULONG_PTR* args = new ULONG_PTR[1];
   args[0] = (long)x;
   RaiseException(EXCEPTION_CODE,0,1,args);
}

Оставляя все остальное в стороне, char* x из customHandleException() будет указывать на массив символов, выделенный в foo().Это приведет к утечке памяти или удаление будет работать?

1 Ответ

6 голосов
/ 14 сентября 2011

Вы должны использовать delete[]. Память, выделенная с new[] , ДОЛЖНА быть освобождена с delete[].

Ссылка:

C ++ 03 Стандарт: § 3.7.4.2-3

Если функция освобождения завершается выдачей исключения, поведение не определено. Значение первого аргумента, переданного функции освобождения, может быть значением нулевого указателя; если так, и если функция освобождения предоставлена ​​в стандартной библиотеке, вызов не имеет никакого эффекта. В противном случае предоставленное значение для оператора delete(void*) в стандартной библиотеке должно быть одно из значений, возвращаемых предыдущим вызовом оператора new(std::size_t) или operator new(std::size_t, const std::nothrow_-t&) в стандартной библиотеке, и значение, предоставленное оператору delete[](void*) в стандарте библиотека должна быть одним из значений, возвращаемых предыдущим вызовом operator new[](std::size_t) или operator new[](std::size_t, const std::nothrow_t&) в стандартной библиотеке.

...