Kun*_*ani 7 c++ java malloc pointers new-operator
据我所知,new操作员做了以下事情:(如果我错了,请纠正我.)
此外,运算符new[]以类似的方式工作,除了它对数组中的每个元素执行此操作.
任何人都可以告诉我这两个运算符在C++和Java中有何不同:
在C++中,T * p = new T;......
为类型的对象分配足够的内存T,
T在该内存中构造一个类型的对象,可能正在初始化它,以及
返回指向该对象的指针.(指针的值与标准的已分配内存的地址相同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++中通常使用对象的方式.
| 归档时间: |
|
| 查看次数: |
8699 次 |
| 最近记录: |