C++ 可能的内存泄漏?

C++ 可能的内存泄漏?,c++,memory-leaks,C++,Memory Leaks,我有以下代码: 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

我有以下代码:

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);
}

抛开所有其他内容不谈,
customHandleException()
中的
char*x
将指向在
foo()
中分配的字符数组。这会导致内存泄漏还是删除有效?

您应该使用
delete[]
。使用
new[]
分配的内存必须解除分配
delete[]

参考:

C++03标准:§3.7.4.2-3

如果释放函数通过抛出异常终止,则该行为未定义。提供给解除分配函数的第一个参数的值可以是空指针值;如果是,并且如果解除分配函数是标准库中提供的函数,则调用无效。否则,将返回提供的值 标准库中的to operator
delete(void*)
应是先前调用operator
new(std::size\u t)
operator new(std::size\u t,const std::nothrow\u-t&)返回的值之一,以及提供给operator
delete[](void*)标准库中的
应为先前调用
运算符new[](std::size\u t)或
标准库中的新操作符[](std::size\u t,const std::nothrow\u t&)


您应该使用
delete[]
。使用
new[]
分配的内存必须解除分配
delete[]

参考:

C++03标准:§3.7.4.2-3

如果释放函数通过抛出异常终止,则该行为未定义。提供给解除分配函数的第一个参数的值可以是空指针值;如果是,并且如果解除分配函数是标准库中提供的函数,则调用无效。否则,将返回提供的值 标准库中的to operator
delete(void*)
应是先前调用operator
new(std::size\u t)
operator new(std::size\u t,const std::nothrow\u-t&)返回的值之一,以及提供给operator
delete[](void*)标准库中的
应为先前调用
运算符new[](std::size\u t)或
标准库中的新操作符[](std::size\u t,const std::nothrow\u t&)


用户代码中不允许使用下划线大写名称;它们是为编译器和标准库保留的。不,这是一个很好的注释。如果这是一个答案,那么它就漏掉了要点。用户代码中不允许使用下划线-大写名称;它们是为编译器和标准库保留的。不,这是一个很好的注释。如果这是一个答案,那么它就没有抓住要点。除此之外,还会有内存泄漏吗?那是一个输入错误:)@Luchian:只要你用
new[]
返回的相同地址调用
delete[]
,就不会有任何泄漏。@Luchian Grigore:好的,如果是一个输入错误,你的代码从一开始就没有问题。除此之外,还会有内存泄漏吗?那是一个输入错误:)@Luchian:只要你用
new[]
返回的相同地址调用
delete[]
,就不会有任何泄漏。@Luchian Grigore:好的,如果是一个输入错误,你的代码从一开始就没有问题。