当我使用数组名称作为指针编译代码,并且我使用delete
删除了数组名称时,我收到了关于删除数组而不使用数组形式的警告(我不记得确切措词)。
基本代码是:
int data[5];
delete data;
那么,删除的数组形式是什么?
答案 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
如果您正在处理本地范围内的内存,请考虑使用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
答案 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;