C++中的new运算符与java中的new运算符之间的区别

Kun*_*ani 7 c++ java malloc pointers new-operator

据我所知,new操作员做了以下事情:(如果我错了,请纠正我.)

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

此外,运算符new[]以类似的方式工作,除了它对数组中的每个元素执行此操作.

任何人都可以告诉我这两个运算符在C++和Java中有何不同:

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

Ker*_* SB 9

  • 在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是可以绑定到类型的Java变量T(或其基础,例如Object)的东西,并且你必须始终有一个初始化器(所以你要说T x = new T();).对象的生命周期是不确定的,但保证至少与任何变量仍然引用对象一样长,并且无法(也不需要)手动销毁对象.Java没有明确的内存概念,您无法控制分配的内部.

此外,C++允许许多不同形式的new表达式(所谓的放置形式).它们都创建动态存储对象,必须手动销毁,但它们可能相当随意.据我所知,Java没有这样的设施.


最大的区别可能就是使用:在Java中,你new一直都在使用所有的东西,而且你必须这样做,因为它是创建(类型)对象的唯一方法.相比之下,在C++中,你几乎不应该new在用户代码中使用裸体.C++有无约束变量,因此变量本身可以是对象,这就是C++中通常使用对象的方式.