c++ delete []是否适用于原始类型

Is c++ delete [] applicable to primitive types

在C++中,如果我有一个原始类型的动态分配数组,是否有必要使用delete[]来防止内存泄漏? 例如,

char * x = new char[100];
delete x; // is it required to call delete [] x?
struct A {
 ...
};
A *p = new A[30];
delete [] p; // delete p would cause memory leakage

请评论。

当你使用new运算符的数组形式时,你必须使用delete运算符的数组形式。

char * x = new char[100];
delete [] x;

char * y = new char;
delete y;

newdelete一起使用的形式不依赖于开始分配和释放的对象类型。

如果你使用

A *p = new A[30];
delete [] p;

该程序存在未定义的行为。可能会导致内存泄漏,继续运行但也可能会崩溃

是的。 delete [] 运算符只是告诉编译器删除数组的所有元素,而不仅仅是第一个元素。这适用于所有类型,整数和非整数。

是的,因为语言需要它。

当数组是标量类型时,很可能如果您不小心使用 delete 而不是 delete[] 那么您的程序仍然可以运行。但它仍然是未定义的行为---标准不保证它有效,你的编译器的下一个版本可能会破坏你的程序。

如果您通过 new T[n] 分配内存,则必须通过 delete[].

删除它

参考Faq问题。

Dynamic memory in C++.

pointer = new T
pointer = new T [number_of_elements]

第一个表达式用于分配内存以包含类型 T 的单个元素。第二个用于分配 T 类型元素的块(数组),其中 number_of_elements 是表示这些元素数量的整数值。例如:

1.  int * foo;
2.  foo = new int [5]; 

在下面的语句中,第一个语句释放使用new分配的单个元素的内存,第二个语句使用new释放为元素数组分配的内存,并在括号([])中分配内存。

1. delete pointer;
2. delete[] pointer;

运算符delete的形式必须对应运算符new的形式。所以用 AnyType *x = new AnyType[n] 分配的数组必须用 delete [] x 释放。以任何其他方式(如 delete x)释放会产生未定义的行为。对于任何类型 - 原始类型或非原始类型。