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

17 c++ arrays memory-management

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

基本代码是:

int data[5];
delete data;
Run Code Online (Sandbox Code Playgroud)

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

Ric*_*dle 46

删除的数组形式是:

delete [] data;
Run Code Online (Sandbox Code Playgroud)

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

int data[5];
Run Code Online (Sandbox Code Playgroud)

您只应在使用new如下方式分配内存时调用它:

int *data = new int[5];
Run Code Online (Sandbox Code Playgroud)

  • 但是他的int数据[5]并没有被运算符new()分配,所以没有正确形式的operator delete()可以被调用. (2认同)
  • 回答实际问的问题很容易,而不是应该问的问题.特别是当它在标题和最后一句中重复出现时. (2认同)

RBe*_*eig 18

你要么:

int *data = new int[5];
... // time passes, stuff happens to data[]
delete[] data;
Run Code Online (Sandbox Code Playgroud)

要么

int data[5];
... // time passes, stuff happens to data[]
// note no delete of data
Run Code Online (Sandbox Code Playgroud)

属规则是:仅适用delete于来自的记忆new.如果使用了数组形式new,则必须使用delete匹配的数组形式.如果使用了展示位置new,那么您要么根本不打电话delete,要么使用匹配的展示位置delete.

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


Dan*_*nyT 5

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

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

  . . . // do stuff with the array

  delete [] data; // Explicitly free memory
}
Run Code Online (Sandbox Code Playgroud)

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

更好的是,很少需要使用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
Run Code Online (Sandbox Code Playgroud)

如果您正在处理本地作用域中的内存,请考虑使用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
Run Code Online (Sandbox Code Playgroud)

阅读有关auto_buffer的更多信息.