"delete" 的数组形式是什么?

28

当我使用数组名称作为指针编译代码,并使用 delete 删除数组名称时,我收到了一个关于未使用数组形式删除数组的警告(我不记得确切的措辞)。

基本代码如下:

int data[5];
delete data;

那么,delete 的数组形式是什么?


3
这会导致未定义的行为,因为该数组没有使用new[]进行分配。 - Rob Kennedy
6个回答

64

删除的数组形式如下:

delete [] data;

编辑: 但正如其他人指出的那样,您不应该针对像这样定义的数据调用delete

int data[5];

你只应该在使用new分配内存时调用它:

int *data = new int[5];

3
但是他的 int data[5] 数组不是通过 operator new() 进行分配的,因此没有正确的 operator delete() 可以调用。 - RBerteig
1
有趣...答案是正确的,但是却非常错误。他怎么已经得到了17票? - Jared Oberhaus
2
回答实际提出的问题比回答本应该被提出的问题要容易得多。特别是当这个问题在标题和最后一句话中都被重复时。 - RBerteig
Jared - 仅限于回答你的问题,而不是回答是否值得的问题,也许被标记为接受答案的答案往往会吸引更多的投票。看看SO的人们是否对所有答案的投票率进行任何统计分析,并在标记接受答案之前和之后进行比较,这将是有趣的。 - JamieH
在原来的问题中,如果用户没有调用上述提到的删除表单,并且没有用替代形式创建数据,那么他或她会造成内存泄漏吗?更新:不会。 - Seanny123

22
你可能想要的是:
int *data = new int[5];
... // time passes, stuff happens to data[]
delete[] data;
或者
int data[5];
... // time passes, stuff happens to data[]
// note no delete of data
通用规则是:只对来自new的内存使用delete。如果使用了new的数组形式,则必须使用数组形式的delete进行匹配。如果使用了放置new,则要么根本不调用delete,要么使用相应的放置delete进行匹配。
由于变量int data[5]是静态分配的数组,因此无法将其传递给任何形式的delete运算符。

5

正如其他人所说,你必须使用删除的向量形式:

void some_func(size_t n)
{
  int* data = new int[n];

  . . . // do stuff with the array

  delete [] data; // Explicitly free memory
}

非常小心这一点,因为有些编译器不会警告你。

更好的做法是尽可能避免使用向量new/delete。考虑是否可以修改代码以利用std::vector:

void some_func(size_t n)
{
  std::vector<int> data(n);

  . . . // do stuff with the array

} // memory held by data will be freed here automatically

如果您正在处理本地范围内的内存,请考虑使用STLSoftauto_buffer,它将从内部缓冲区(作为实例的一部分,在堆栈上持有)中分配内存,只有在无法时才会进入堆栈:

void some_func(size_t n)
{
  stlsoft::auto_buffer<int, 10> data(n); // only allocates if n > 10

  . . . // do stuff with the array

} // memory held by data will be freed here automatically, if any was allocated

阅读有关auto_buffer的更多信息


2

代码中所示的数组要么在堆栈上,要么在数据段的初始化部分中,即你不需要释放它(正如其他人所提到的,这将是"未定义行为")。如果它在"自由存储区",你可以使用 delete [] data 来处理它。


0
正如RichieHindle在上面所述,当您想要释放由data指向的动态分配的数组的空间时,您必须在保留字delete和分配空间开头的指针之间放置两个括号[]。由于data既可以指向内存中的单个int,也可以指向数组中的第一个元素,这是您让编译器知道您要删除整个内存块的唯一方法。如果您不按正确方式执行,则行为是“未确定的”(Stroustrup,《C++程序设计语言》)。

0

修复 C4154 和 C4156 警告

float AR[5] = { 1.0f, 2.0f, ..., ..., ...};

delete [] & AR;

这是非常错误的。如果数组不是用 new[] 创建的,尝试 delete[] 将会导致未定义的行为。如果你很幸运,它会崩溃,这样你就可以找到这个可怕的 bug。 - Blastfurnace

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接