7

new和有什么区别new[1]?我可以使用deletenew[1]

编辑

好吧好吧,我应该提供背景,抱歉。我正在使用 VS 2010 评估 BoundsChecker,当我在 new[1] 上使用 delete[] 时,它抱怨内存泄漏。所以理论上我知道应该如何使用 new 和 delete 对,但是这种特殊情况让我对引擎盖下的事情感到困惑。知道发生了什么吗?

4

4 回答 4

12

Ed 和 aix 是对的,但背后还有很多事情要做。

如果使用 new,然后 delete,则 delete 调用将执行一个析构函数。

如果使用new[],就必须使用delete[],但是delete[]怎么知道调用了多少析构函数呢?可能有 2 个实例的数组,还是 2000 个实例中的一个?一些(可能是大多数或全部)编译器所做的是在它返回给您的内存之前存储实例的数量。

所以如果你调用 new[5],那么 new 会像这样分配内存:

+---+-----------+-----------+-----------+-----------+-----------+
| 5 | instance1 | instance2 | instance3 | instance4 | instance5 |
+---+-----------+-----------+-----------+-----------+-----------+

你得到一个指向instance1的指针。

如果您稍后调用 delete[],delete[] 将使用该数字(在本例中为 5)来查看在释放内存之前需要调用多少个析构函数。

请注意,如果您将 new 与 delete[] 或 new[] 与 delete 混合使用,则可能会出现严重错误,因为数字可能丢失,或者数字可能不正确。

如果将 new[1] 与 delete 混合使用,您可能很幸运,但不要依赖它。

于 2011-09-22T06:52:18.583 回答
11

new创建一个实例,而new[1]创建一个单元素数组。与存储数组大小new[1]相比,几乎肯定会产生(小)内存开销。new您不能将非默认构造函数与new[].

new必须与delete.

new[]必须与delete[].

于 2011-09-22T06:46:45.097 回答
2

new[] 是分配和初始化对象数组并返回指向第一个元素的指针的运算符。这与 new 运算符不同,new 运算符具有相同的行为,但只针对一个分配,而不是数组。对于释放和对象销毁,new 应与 delete 一起使用,new[] 应与 delete[] 一起使用。

// operator new[] and new example

// create array of 5 integers
int * p1 = new int[5];
delete[] p1;

// regular allocation of one int
int * p1 = new int;
delete p1;

(见这里了解更多详情)

于 2011-09-22T07:00:24.007 回答
0

'new[1]' 创建一个包含一项的数组。需要用来delete[]释放内存。new只是创建一个对象。与它一起使用delete

于 2011-09-22T06:45:43.163 回答