Vis*_*hal 6 c++ new-operator dynamic-allocation
new和之间有什么区别new[1]?我可以delete用new[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[].