6 回答 6
This answer is useful
19
new[]匹配的要求在delete[]技术上是正确的。
然而(至少在我看来)更好的是忘记你曾经听说过new[],并且永远不再使用它。我很确定自上次使用 以来已经(至少)10 年了new[],如果我能很好地了解情况,我会比那更早停止。几乎任何时候您甚至会考虑使用new[],std::vector(或可能std::deque)将是更好的选择。
如果您尝试创建大致相当于 avector或deque您自己的东西,您通常也不想使用new[]它。他们的方式(至少通常情况下,虽然可以通过自定义Allocator类来改变它)是分配“原始”存储operator new(这很像malloc——你只需给它一个大小,它就会给你这么多字节贮存)。然后使用放置new操作符在该空间中创建对象,并显式调用对象的析构函数来销毁该空间中的对象。
举一个例子,这是允许std::vector支持的,它允许你分配额外的空间,在你调用类似的东西或在你分配的空间中创建一个实际的对象reserve之前,这些空间不会变成对象。push_backemplace_back
当您使用new[]时,它必须创建指定类型的对象来填充您分配的所有空间。您不能创建这样的东西push_back,将新对象添加到集合中,因为集合始终已经“满”。您所能做的就是分配一个比旧集合更大的新集合(因此集合中的每个添加都是 O(N) 而不是由std::vector--a 巨大的效率损失支持的摊销 O(1))。
于 2009-09-28T00:29:09.907 回答
This answer is useful
9
它的:
delete[] foo;
编辑:现代编译器确实需要您使用正确的delete运算符,否则它们可能会泄漏内存或无法运行正确的析构函数。
(我之前说过它在实践中没有什么不同。大约 10 年前,我尝试了许多不同的编译器,但如果你错误地省略了 .,我却找不到一个真正泄漏内存的编译器[]。但是,暴民的嚎叫 - 见下文 -迫使我重新尝试我的实验,似乎现代编译器/libc++s 真的很在意。)
于 2009-09-27T23:15:13.923 回答
This answer is useful
5
如果使用运算符分配对象数组,new []则必须使用delete []运算符,因此非数组new只能与非数组一起使用delete。
int *a = new int[10];
int *b = new int;
delete [] a;
delete b;
于 2009-09-27T23:15:08.807 回答
This answer is useful
3
如果你这样做,new
于 2009-09-27T23:14:54.457 回答
This answer is useful
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.
不要把它们混在一起!
于 2009-09-27T23:30:52.453 回答
This answer is useful
2
任何时候你new编辑你使用的数组delete[]。有时您使用新的数组new- 然后您仍然必须使用delete[]- 没有出路。因此,这不完全是一条规则“当你 new[]'ed 时使用 delete[]”,而是“在删除数组时使用 delete[]”。
typedef int array[5];
int *a = new array;
delete[] a; // still delete[] !
于 2009-09-29T21:24:11.083 回答