当我使用数组名称作为指针编译代码,并使用 delete
删除数组名称时,我收到了一个关于未使用数组形式删除数组的警告(我不记得确切的措辞)。
基本代码如下:
int data[5];
delete data;
那么,delete 的数组形式是什么?
当我使用数组名称作为指针编译代码,并使用 delete
删除数组名称时,我收到了一个关于未使用数组形式删除数组的警告(我不记得确切的措辞)。
基本代码如下:
int data[5];
delete data;
那么,delete 的数组形式是什么?
删除的数组形式如下:
delete [] data;
编辑: 但正如其他人指出的那样,您不应该针对像这样定义的数据调用delete
:
int data[5];
你只应该在使用new
分配内存时调用它:
int *data = new int[5];
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
运算符。正如其他人所说,你必须使用删除的向量形式:
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
如果您正在处理本地范围内的内存,请考虑使用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
阅读有关auto_buffer的更多信息。
代码中所示的数组要么在堆栈上,要么在数据段的初始化部分中,即你不需要释放它(正如其他人所提到的,这将是"未定义行为")。如果它在"自由存储区",你可以使用 delete [] data
来处理它。
data
指向的动态分配的数组的空间时,您必须在保留字delete
和分配空间开头的指针之间放置两个括号[]
。由于data
既可以指向内存中的单个int
,也可以指向数组中的第一个元素,这是您让编译器知道您要删除整个内存块的唯一方法。如果您不按正确方式执行,则行为是“未确定的”(Stroustrup,《C++程序设计语言》)。修复 C4154 和 C4156 警告
float AR[5] = { 1.0f, 2.0f, ..., ..., ...};
delete [] & AR;
new[]
创建的,尝试 delete[]
将会导致未定义的行为。如果你很幸运,它会崩溃,这样你就可以找到这个可怕的 bug。 - Blastfurnace