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

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

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 []你必须这样做delete []。这是一个足够简单的规则,值得记住。

于 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 回答

相关推荐

水银体温计打碎了如何处置?别慌,这样做→
足球365官网正规吗

水银体温计打碎了如何处置?别慌,这样做→

📅 09-03 👁️ 1806
win11的文档文件夹消失
365平台被黑不给出款怎么办

win11的文档文件夹消失

📅 12-14 👁️ 4860
域名购买了能用多久
365bet大陆网站

域名购买了能用多久

📅 07-06 👁️ 5527