new
和有什么区别new[1]
?我可以使用delete
吗new[1]
?
编辑
好吧好吧,我应该提供背景,抱歉。我正在使用 VS 2010 评估 BoundsChecker,当我在 new[1] 上使用 delete[] 时,它抱怨内存泄漏。所以理论上我知道应该如何使用 new 和 delete 对,但是这种特殊情况让我对引擎盖下的事情感到困惑。知道发生了什么吗?
new
和有什么区别new[1]
?我可以使用delete
吗new[1]
?
编辑
好吧好吧,我应该提供背景,抱歉。我正在使用 VS 2010 评估 BoundsChecker,当我在 new[1] 上使用 delete[] 时,它抱怨内存泄漏。所以理论上我知道应该如何使用 new 和 delete 对,但是这种特殊情况让我对引擎盖下的事情感到困惑。知道发生了什么吗?
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 混合使用,您可能很幸运,但不要依赖它。
new
创建一个实例,而new[1]
创建一个单元素数组。与存储数组大小new[1]
相比,几乎肯定会产生(小)内存开销。new
您不能将非默认构造函数与new[]
.
new
必须与delete
.
new[]
必须与delete[]
.
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;
(见这里了解更多详情)
'new[1]' 创建一个包含一项的数组。需要用来delete[]
释放内存。new
只是创建一个对象。与它一起使用delete
。