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];
...
}