什么是'删除'的数组形式?

时间:2009-05-13 21:10:43

标签: c++ arrays memory-management

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

基本代码是:

int data[5];
delete data;

那么,删除的数组形式是什么?

6 个答案:

答案 0 :(得分:45)

删除的数组形式为:

delete [] data;

编辑但正如其他人所指出的那样,你不应该为delete调用这样定义的数据:

int data[5];

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

int *data = new int[5];

答案 1 :(得分:18)

你要么:

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

属规则是:仅将delete应用于来自new的内存。如果使用了new的数组形式,那么必须使用delete的数组形式进行匹配。如果使用展示位置new,则您永远不会致电delete,或使用匹配的展示位置delete

由于变量int data[5]是静态分配的数组,因此无法将其传递给任何形式的delete运算符。

答案 2 :(得分:5)

正如其他人所说,你必须使用delete的矢量形式:

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

  . . . // do stuff with the array

  delete [] data; // Explicitly free memory
}

要非常小心,因为有些编译器会警告你。

更好的是,很少需要使用vector 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

阅读more about auto_buffer

答案 3 :(得分:2)

如图所示的代码在堆栈上或数据段的初始化部分中具有数组,即您不释放它(正如其他人所提到的那样,它将是“未定义的行为”。)它是否在上面“免费商店”,您可以使用delete [] data

答案 4 :(得分:0)

正如RichieHindle在上面所说的那样,当你想释放为data指向的数组动态分配的空间时,你必须在保留字[]和指针之间放置两个括号delete到分配空间的开头。由于data可以指向内存中的单个int以及数组中的第一个元素,因此这是让编译器知道您要删除整个内存块的唯一方法。如果你没有按照正确的方式行事“未确定”(Stroustrup, C ++编程语言)。

答案 5 :(得分:0)

修复了 C4154 和 C4156 警告

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

delete [] & AR;