我是C ++的新手,我对数组和指针感到困惑。有人能告诉我如何正确删除指针。例如,
int *foo;
foo = new int[10];
delete foo;
或
delete [] foo;
感谢。
答案 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[] !