如何正确删除指向数组的指针

时间:2009-09-27 23:13:14

标签: c++

我是C ++的新手,我对数组和指针感到困惑。有人能告诉我如何正确删除指针。例如,

int *foo;
foo = new int[10];

delete foo;

delete [] foo;

感谢。

6 个答案:

答案 0 :(得分:18)

将new []与delete []匹配的要求在技术上是正确的。

然而,更好的是忘记你曾经听说过新的[],再也不会再使用它了。我很确定自从上次使用新[]以来已经(至少)10年了,如果我对这种情况了解得很清楚,我就会早点停下来。几乎任何时候你甚至考虑使用new [],std :: vector(或者可能是std :: deque)将是更好的选择。

答案 1 :(得分:8)

这是:

delete[] foo;

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

(我之前曾说过,它在实践中并没有什么不同。大约10年前,我尝试了许多不同的编译器,如果你错误地省略了[],却找不到实际泄露内存的编译器。暴徒的嚎叫 - 见下文 - 迫使我重新尝试我的实验,似乎现代编译器/ libc ++真的很关心。)

答案 2 :(得分:5)

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

delete

答案 3 :(得分:3)

如果您执行new <type>[],则必须delete []。这是一个足够简单的规则,值得记住。

答案 4 :(得分:2)

你走进前门,把它打开了。然后你走到后门并试图关闭它,但你把它弄坏了,因为它已经关闭了。

foo = new int [10];  // so when you open the front door
delete [] foo;       // please remember to close the front door.

foo = new int;       // and when you open the back door
delete foo;          // please remember to close the back door.

不要混淆它们!

答案 5 :(得分:2)

new编辑数组的任何时候都使用delete[]。有时你使用new新建一个数组 - 然后你仍然需要使用delete[] - 没有出路。因此,在新的[]'ed'中使用delete []并不是一个规则,而是在删除数组时“使用delete []”。

typedef int array[5];

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