据我所知,new
运算符做了以下事情:(如果我错了,请纠正我。)
- 分配内存,然后返回第一个 block 的引用 分配的内存。 (显然,内存是从堆中分配的。)
- 初始化对象(调用构造函数)
运算符 new[]
也以类似的方式工作,只是它对数组中的每个元素都这样做。
谁能告诉我这些运算符在 C++ 和 Java 中有何不同:
- 就其生命周期而言。
- 如果他们无法分配内存怎么办。
最佳答案
- 在 C++ 中,
T * p = new T;
...
为
T
类型的对象分配足够的内存,在该内存中构造一个
T
类型的对象,可能对其进行初始化,并且返回指向对象的指针。 (指针与标准
new
的分配内存地址具有相同的值,但对于数组形式new[]
则不必如此。)
如果内存分配失败,将抛出类型为 std::bad_alloc
的异常,不构造对象也不分配内存。
如果对象构造函数抛出异常,则(显然)不会构造任何对象,立即自动释放内存,并传播异常。
否则,一个动态分配对象已经被构建,用户必须手动销毁该对象并释放内存,通常是说delete p;
。
实际的分配和释放函数可以在C++中控制。如果没有别的,则使用全局预定义函数 ::operator new()
,但这可能会被用户替换;如果存在静态成员函数 T::operator new
,则将使用该成员函数。
- 在 Java 中它非常相似,只是
new
的返回值是可以绑定(bind)到T
类型的 Java 变量(或其基类,例如Object
),并且你必须始终有一个初始化器(所以你会说T x = new T();
)。对象的生命周期是不确定的,但保证至少只要任何变量仍然引用该对象,并且没有办法(也不需要)手动销毁该对象。 Java 没有明确的内存概念,您无法控制分配的内部。
此外,C++ 允许许多不同形式的 new
表达式(所谓的 placement 形式)。它们都创建必须手动销毁的动态存储对象,但它们可以相当随意。据我所知,Java 没有这样的设施。
最大的区别可能在于使用:在 Java 中,您总是使用 new
来处理所有事情,而且您必须,因为这是创建(类类型)对象的唯一方法。相比之下,在 C++ 中,您几乎不应该在用户代码中使用裸 new
。 C++ 有不受约束的变量,因此变量本身可以是对象,这就是 C++ 中通常使用对象的方式。
关于java - C++中new运算符和java中new运算符的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17014747/