新旧有什么区别[1]?

Vis*_*hal 6 c++ new-operator dynamic-allocation

new和之间有什么区别new[1]?我可以deletenew[1]吗?

编辑

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

Pat*_*ick 12

Ed和aix是对的,但是在引擎盖下还有更多的东西.

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

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

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

+---+-----------+-----------+-----------+-----------+-----------+
| 5 | instance1 | instance2 | instance3 | instance4 | instance5 |
+---+-----------+-----------+-----------+-----------+-----------+
Run Code Online (Sandbox Code Playgroud)

然后你得到一个指向instance1的指针.

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

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

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


NPE*_*NPE 10

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

new必须使用delete.

new[]必须使用delete[].

  • +1表示在使用new []时必须有默认构造函数.这经常被忽视. (2认同)

Ed *_*eal 0

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