关于c ++:如何正确删除指向数组的指针


how to properly delete a pointer to array

我是C++新手,我对数组和指针感到困惑。有人能告诉我如何正确删除一个指针吗?比如说,

1
2
3
4
int *foo;
foo = new int[10];

delete foo;

1
delete [] foo;

谢谢。


将新的[]与删除的[]匹配的要求在技术上是正确的。

然而,更好的办法是忘记你曾经听说过新的[],不要再使用它。我很肯定,我上次使用新的[]已经(至少)10年了,如果我能很好地了解情况,我会更快地停止使用。STD::矢量(或者STD::DEQE)将是一个更好的选择。


它是:

1
delete[] foo;

编辑:现代编译器确实需要您使用正确的delete操作符,否则它们可能会泄漏内存或无法运行正确的析构函数。

(我之前说过,这在实践中没有什么不同。大约10年前,我尝试了许多不同的编译器,但如果您错误地忽略了[],就找不到一个真正泄漏内存的编译器。然而,暴徒的怒吼——见下文——迫使我重新尝试我的实验,而且似乎现代编译器/libc++s真的很在意。)


如果使用new []运算符分配对象数组,则必须使用delete []运算符,因此非数组new只能与非数组delete一起使用。

1
2
3
4
5
int *a = new int[10];
int *b = new int;

delete [] a;
delete b;

如果你做new [],你必须做delete []。这是一个足够简单的规则,值得记住。


任何时候当你使用一个数组时,你都会使用一个数组。有时,您使用new创建了一个数组,然后您仍然需要使用delete[],这是不可能的。所以这不是一条规则"新建时使用delete[]"而是"删除数组时使用delete[]"。

1
2
3
4
typedef int array[5];

int *a = new array;
delete[] a; // still delete[] !

你走进前门,让它开着。然后你走到后门试图关上它,但你把它砸碎了,因为它已经关上了。

2

别把它们弄混了!