新和new[1]之间有什么区别?

7
什么是newnew[1]之间的区别?我能否用delete来释放new[1]
编辑
好的,我应该提供背景信息,对此感到抱歉。我正在使用VS 2010评估BoundsChecker,在使用delete[]释放new[1]时会出现内存泄漏的警告。理论上,我知道如何正确使用new和delete成对使用,但这种特殊情况让我对底层的东西感到困惑。有任何想法吗?
4个回答

13

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可以正常工作,那么你可能只是幸运,但不要依赖这种情况。


10

new关键字用于创建一个实例,而new[1]则创建一个只有一个元素的数组。相比于newnew[1]几乎肯定会产生(轻微的)内存开销来存储数组的大小。你不能在new[]中使用非默认构造函数。

new必须与delete一起使用。

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


2
+1 是指当使用 new[] 时必须要有默认构造函数,这点经常被忽视。 - Patrick
另一方面,在大多数系统上,具有平凡析构函数的类型在内存开销方面不会有任何区别(但允许存在差异)。 - James Kanze
@NPE ***你不能使用非默认构造函数与new[]***。请问您能否详细说明一下?您的意思是如果一个特定的类没有有效的默认构造函数,那么它就不能与new[]一起使用吗?我理解的对吗? - John

2

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;

(详见此处了解更多细节)

0

'new[1]' 创建一个包含一个元素的数组。需要使用 delete[] 释放内存。 new 只是创建一个对象。请使用 delete


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接