新旧有什么区别[1]?

时间:2011-09-22 06:41:20

标签: c++ dynamic-allocation new-operator

newnew[1]之间有什么区别?我可以将deletenew[1]一起使用吗?

修改

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

4 个答案:

答案 0 :(得分:12)

Ed和aix是对的,但是在幕后还有更多的事情发生。

如果使用new,则删除,删除调用将执行一个析构函数。

如果使用new [],则必须使用delete [],但delete []如何知道要调用多少析构函数?可能有2个实例的数组,或2000个实例之一? 一些(可能是大多数或所有)编译器所做的是将实例数存储在它返回给你的内存之前。

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

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

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

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

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

如果将新[1]与删除混合起作用,您可能只是幸运,但不要依赖它。

答案 1 :(得分:10)

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

new必须与delete一起使用。

new[]必须与delete[]一起使用。

答案 2 :(得分:1)

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;

(有关详细信息,请参阅here

答案 3 :(得分:0)

'new [1]'创建一个项目的数组。需要使用delete[]释放内存。 new只是创建一个对象。使用delete