在C ++中,
T * p = new T;
…对于类型的对象分配足够的内存
T
,T
在该内存中构造类型的对象,可能会对其进行初始化,并且返回指向该对象的指针。(指针的值与标准分配的内存的地址相同
new
,但是数组形式则不必如此new[]
。)
如果内存分配失败,
std::bad_alloc则抛出类型异常,不构造任何对象,也不分配内存。
如果对象构造函数抛出异常,则(显然)没有对象被构造,内存会立即自动释放,并且传播该异常。
否则,将构造一个 动态分配的 对象,并且用户必须手动销毁该对象并释放内存,方法通常是说
delete p;。
实际的分配和释放函数可以在C ++中控制。如果没有其他内容,则使用全局的预定义函数
::operator new(),但是可以由用户 替换
;如果存在静态成员函数
T::operator new,则将使用该成员函数。
- 在Java中,这非常相似,只是Java的返回值
new
可以绑定到类型为Java的变量T
(或其基数,例如Object
),并且您必须始终具有初始化程序(因此您可以说T x = new T();
)。对象的生存期不确定,但是至少要保证只要任何变量仍引用该对象,并且就没有办法(也不需要)手动销毁该对象。Java没有明确的内存概念,您无法控制分配的内部。
此外,C ++允许许多不同形式的
new表达式(所谓的 放置
形式)。它们都创建了必须手动销毁的动态存储对象,但是它们可以相当随意。据我所知,Java没有这种功能。
最大的区别可能是 使用 :在Java中,你用
new所有的时间的一切,你 必须 要,因为它是唯一创建(类型)方式的对象。相比之下,在C
中,您几乎不应
new在用户代码中使用裸体。C 具有不受约束的变量,因此变量本身可以是对象,这就是C ++中通常使用对象的方式。



