我有以下代码:
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);
}
Run Code Online (Sandbox Code Playgroud)
离开一切不谈,char* x从customHandleException()将指向分配的字符数组foo().这会导致内存泄漏还是删除工作?
你应该使用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*)标准库中的操作符的值应该是由a返回的值之一.以前调用任何一个operator new[](std::size_t)或operator new[](std::size_t, const std::nothrow_t&)在标准库中.