java - C++中new运算符和java中new运算符的区别

标签 java c++ pointers malloc new-operator

据我所知,new 运算符做了以下事情:(如果我错了,请纠正我。)

  1. 分配内存,然后返回第一个 block 的引用 分配的内存。 (显然,内存是从堆中分配的。)
  2. 初始化对象(调用构造函数)

运算符 new[] 也以类似的方式工作,只是它对数组中的每个元素都这样做。

谁能告诉我这些运算符在 C++ 和 Java 中有何不同:

  1. 就其生命周期而言。
  2. 如果他们无法分配内存怎么办。

最佳答案

  • 在 C++ 中,T * p = new T;...
  1. T类型的对象分配足够的内存,

  2. 在该内存中构造一个 T 类型的对象,可能对其进行初始化,并且

  3. 返回指向对象的指针。 (指针与标准 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/

相关文章:

Java 为什么 DatagramPacket 的构造函数需要字节数组的长度?

java - 如何在具有不同行的多对一关系字典表中?

c++ - 为什么删除两次相同的内存都没有报错?

C:向动态分配的数组添加元素

c - 在 C 中释放双指针

java - 从二维数组创建图边时,arr[i][0]、arr[i][1]是什么意思?

java - 创建并显示新 Activity ,不能使用我的 fragment ?

c++ - QTextToSpeech 设置默认 QLocale

c++ - 如何将 Catch2 作为外部库与 CMake 集成?

C 链表大小不受malloc限制