当前位置: 首页 > 面试题库 >

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

茹照
2023-03-14
问题内容

据我所知,new操作员会执行以下操作:(如果我错了,请纠正我。)

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

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

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

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

问题答案:
  • 在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 ++中通常使用对象的方式。



 类似资料:
  • 本文向大家介绍详解C++中new运算符和delete运算符的使用,包括了详解C++中new运算符和delete运算符的使用的使用技巧和注意事项,需要的朋友参考一下 C++ 支持使用 new 和 delete 运算符动态分配和释放对象。这些运算符为来自称为“自由存储”的池中的对象分配内存。 new 运算符调用特殊函数 operator new,delete 运算符调用特殊函数 operator de

  • 在C语言中,动态分配内存用 malloc() 函数,释放内存用 free() 函数。如下所示: 在C++中,这两个函数仍然可以使用,但是C++又新增了两个关键字,new 和 delete:new 用来动态分配内存,delete 用来释放内存。 用 new 和 delete 分配内存更加简单: new 操作符会根据后面的数据类型来推断所需空间的大小。 如果希望分配一组连续的数据,可以使用 new[]

  • 问题内容: 和运算符之间有什么区别,它们的用例是什么?他们俩似乎都是为了一项任务? 问题答案: 仅是赋值运算符。 是Short变量声明子句语法的一部分。 though虽然有一些规则。

  • 问题内容: 如果移位的数字为正,>>>和>>的工作原理相同。 如果移位数为负,>>>将最高有效位填充为1,而>>操作将MSB填充为0。 我的理解正确吗? 如果负数是在MSB设置为1的情况下存储的,而不是Java使用2s补码的方式,则运算符的行为将完全不同,对吗? 问题答案: 表示负数的方式称为2的补码。为了演示其工作原理,以-12为例。12的二进制值为00001100(假设整数为8位,尽管实际上它

  • 问题内容: 和之间有什么区别?它们都创建一个类的实例,我不确定它们之间有什么区别。 问题答案: 在操作创建一个是静态已知的(在编译时),并可以调用你想创建对象的任何构造一个类型的新对象。这是创建对象的首选方式- 快速且JVM对它进行了许多积极的优化。 是一个动态构造,用于查找具有特定名称的类。它比使用速度慢,因为无法将对象的类型硬编码到字节码中,并且因为JVM可能必须执行权限检查以确保您有权创建对

  • 当我运行这段代码时,我得到以下错误截图 50:7:错误:与“操作员”不匹配