new
和new[1]
之间有什么区别?我可以将delete
与new[1]
一起使用吗?
修改的
很好,我应该提供背景,对不起。我正在使用VS 2010评估BoundsChecker,当我在new [1]上使用delete []时,它抱怨内存泄漏。所以理论上我知道应该如何使用新的和删除对,但这种特殊的情况使我对引擎盖下的事情感到困惑。有什么想法发生了吗?
答案 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
。