我有以下代码:
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
的{{1}}将指向customHandleException()
中分配的字符数组。这会导致内存泄漏还是删除工作?
答案 0 :(得分:6)
您应该使用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&)
返回的值之一 标准库中的{{1}}。