C和x2B中的新运算符之间的差异+;java中的新操作符

C和x2B中的新运算符之间的差异+;java中的新操作符,java,c++,pointers,malloc,new-operator,Java,C++,Pointers,Malloc,New Operator,据我所知,new操作员执行以下操作:(如果我错了,请纠正我。) 分配内存,然后返回 分配的内存。(显然,内存是从堆中分配的。) 初始化对象(调用构造函数。) 此外,操作符new[]的工作方式也类似,只是它对数组中的每个元素都这样做 可以告诉我,这些操作符和C++和java的不同: 就其生命周期而言 如果它们无法分配内存呢 在C++中,代码> t*p=新t; 为类型为T的对象分配足够的内存 在该内存中构造类型为T的对象,可能会对其进行初始化,然后 返回指向对象的指针。(指针的值与标准new

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

  • 分配内存,然后返回 分配的内存。(显然,内存是从堆中分配的。)
  • 初始化对象(调用构造函数。)
  • 此外,操作符
    new[]
    的工作方式也类似,只是它对数组中的每个元素都这样做

    可以告诉我,这些操作符和C++和java的不同:

  • 就其生命周期而言
  • 如果它们无法分配内存呢
      在C++中,<>代码> t*p=新t;<代码>
  • 为类型为
    T
    的对象分配足够的内存

  • 在该内存中构造类型为
    T
    的对象,可能会对其进行初始化,然后

  • 返回指向对象的指针。(指针的值与标准
    new
    所分配内存的地址相同,但数组形式
    new[]
    不必如此)

  • 如果内存分配失败,将抛出类型为
    std::bad_alloc
    的异常,不构造任何对象,也不分配内存

    如果对象构造函数抛出异常,则(显然)不会构造任何对象,内存会立即自动释放,异常会传播

    否则,将构造一个动态分配的对象,用户必须手动销毁该对象并释放内存,通常通过说
    delete p

    <>实际的分配和解除分配功能可以在C++中进行控制。如果没有其他功能,则使用全局预定义函数
    ::operator new()
    ,但用户可以替换该函数;如果存在静态成员函数
    T::operator new
    ,则将使用该函数

    • 在Java中,它非常相似,只是
      new
      的返回值可以绑定到
      T
      类型的Java变量(或其基,例如
      Object
      ),并且必须始终具有初始值设定项(因此可以说
      tx=new T();
      )。对象的生存期是不确定的,但保证至少在任何变量仍然引用对象的情况下存在,并且没有办法(也没有任何必要)手动销毁对象。Java没有明确的内存概念,您无法控制分配的内部
    P>此外,C++允许多种不同形式的<代码>新< /COD>表达式(所谓的放置表单)。它们都创建了必须手动销毁的动态存储对象,但它们可以是任意的。据我所知,Java没有这样的功能



    最大的区别可能在使用上:在Java中,您总是使用
    new
    来处理所有事情,而且您必须这样做,因为这是创建(类类型)对象的唯一方法。相比之下,在C++中,用户代码中几乎不应该有“裸<代码>新< /Calp>”。C++有无约束变量,所以变量本身可以是对象,也就是对象通常如何在C++中使用。

    < p>您似乎有操作<代码>新< /代码>,因为它分配和初始化内存。 一旦
    new
    成功完成,程序员就负责
    delete
    ing该内存。确保发生这种情况的最佳方法是,不要自己直接使用
    new
    ,而应首选标准容器和算法以及基于堆栈的对象。但是如果需要分配内存,C++习惯用法是使用一个智能指针,如C++代码11或代码> > SyddYPPT/<代码>,从Boost或C++ 11中使用。这样可以确保正确回收内存

    如果分配失败,则
    new
    调用将在清除失败之前构建的对象的任何部分后引发异常。您可以使用new的
    (nothrow)
    版本来返回空指针,而不是抛出异常,但这会给客户端代码带来更大的清理负担。

    在您的“语句”中,我认为“返回对第一个分配内存块的引用”是不正确的。
    new
    返回指针(分配给对象的类型)。这与引用略有不同,尽管概念上相似

    回答你的问题:

    在C++中,对象在内存中(参见注释)直到被显式删除,并使用“代码>删除”/>代码>或代码>删除[]/Cord>(并且必须使用与您分配的匹配的一个,因此,<代码>新INT(1);< /C> >,尽管它与“代码>新INT相同的内存量;< /COD>不能用<代码>删除> /Cube删除。(反之亦然,
    delete[]
    不能用于
    new int
    )。在Java中,一旦“没有对内存的引用”,垃圾收集器在将来的某个时候就会释放内存 两个都抛出异常(C++抛出<代码> STD:BADYOLLC/,java类似OutOfMeMyRyPrror),但是C++中可以使用<代码>新(STD:NoPoto)…<代码>,在这种情况下,如果没有足够的内存满足调用,则代码>新< /COD>返回NULL。

    注释:根据注释,技术上可以“摧毁”对象而不释放内存。这是一个非常不寻常的情况,除非你真的有C++经验,否则你不应该做什么,你有很好的理由这么做。(在这里,代码<新的< /Cord>)用已经存在的内存地址调用,以执行对象的构造。再次,放置new是新的特殊用途,而不是普通C++中可以看到的很多东西。

     // C/C++ : allocate array from the stack
        void myFunction() {
          int x[2];
          x[0] = 1;
          ...
        }
    
    // Java : have to use 'new'; JVM allocates
    //        memory where it chooses.
    void myFunction() {
      int[] x = new int[2];
      ...
    }