17 c++ arrays memory-management
当我使用数组名称作为指针编译代码,并且我使用删除了数组名称时delete,我收到了关于删除数组而不使用数组形式的警告(我不记得确切的措辞).
基本代码是:
int data[5];
delete data;
那么,删除的数组形式是什么?
Ric*_*dle 46
删除的数组形式是:
delete [] data;
编辑:但正如其他人所指出的,你不应该调用delete这样定义的数据:
int data[5];
您只应在使用new如下方式分配内存时调用它:
int *data = new int[5];
RBe*_*eig 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运算符.
正如其他人所说,你必须使用删除的矢量形式:
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
如果您正在处理本地作用域中的内存,请考虑使用STLSoft的auto_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