在c++和java中声明对象
declaring objects in C++ vs java
我已经使用c++有一段时间了,现在我正在学习java,
在Java中声明对象让我很困惑,
在java中我们写
myclass myobject = new myclass();
myobject.mymethod();
与c++中的代码相同吗?
myclass *myobject = new myclass();
myobject->mymethod();
。在heap
上分配的内存是多少?如果它在堆上,为什么我们从不释放内存。我相信新的关键字是一样的。如果是这样,我们如何在堆栈上分配内存?
与c++中的代码相同吗?
是的。这是一样的。
。E是在堆上分配的内存?
Yes。
如果它在堆上,为什么我们不释放内存
对象在不可访问时被允许进入垃圾收集器。例如,当没有对该对象的有效引用或(取消引用)
如果是,我们如何在堆栈上分配内存?
当特定线程开始执行时,与该线程相关的变量将被放在堆栈中,并在该线程的任务完成后立即删除。每个线程都有自己的栈
正如您所想的,new
操作符在堆上分配了一个新对象。Java中的内存不是显式释放的——一旦对象没有更多的访问根,它就有资格被释放。垃圾收集线程将定期释放此内存。
虽然说这个C++
代码是等效的并不准确:
myclass* myobject = new myclass();
myobject->mymethod();
也不完全相同。
Java有一个垃圾收集器,因此,正如您注意到的,您不必在Java
中释放对象。
所以更接近原始Java
的可能是:
std::shared_ptr<myclass> myobject = std::make_shared<myclass>();
myobject->mymethod();
现在你不需要释放myobject
,当不再有任何引用时,它会被垃圾收集。
然而,在C++
中为每个堆分配对象使用std::shared_ptr是错误的,因为它确实会降低性能。
作为规则,最好使用std::unique_ptr在一个地方管理堆分配的对象。如果不可能知道哪个组件将是最后一个取消引用对象,则应该在每个位置使用std::shared_ptr。
然而,当调用down到包含智能指针的组件的函数时,你应该传递原始指针或引用:std::shared_ptr<myclass> myobject = std::make_shared<myclass>();
myobject->mymethod();
ptr_needing_func(myobject.get()); // pass raw pointer using get()
ref_needing_func(*mtobject.get()); // pass reference using *get()
这样,在保持垃圾收集智能指针的安全性和便利性的同时,您不会损失任何效率。: CppCoreGuidlines: R.23
在阅读了这个问题的其他答案和其他一些文章之后,我明白了,
c++和java代码都在做非常相似的事情,除了语法不同,java使用引用而不是指针(java没有指针)。
,
myclass myobject;
是myobject的声明,
声明只是通知编译器,我们将使用myobject来引用类型为myclass的变量。没有分配内存
new myclass();
是实例化对象(在堆中分配内存)并返回对它的引用。通过调用构造函数myclass()来初始化对象。
澄清一个非常基本的疑问,
int i;
==>声明对象并在堆栈中为其分配内存
myclass myobject;
==>仅声明对象的引用变量(根据系统的不同,它也需要4个字节或8个字节)。它不分配存储实例变量的实际内存。
换句话说,在为基本数据类型声明时分配内存,而不是为非基本数据类型声明内存。对于非原语数据类型,我们需要使用new关键字来分配它们。
为什么我们从不释放内存?
Java有垃圾收集器,它会自动为我们做这些。
如何为堆栈中的对象分配内存?
我们不能。
- Arduino C++在构造函数中用参数声明对象数组
- 为什么我在声明对象数组时不能使用 -> 运算符?
- 如何在 if 语句中声明对象并在任何我想的地方使用它?
- 如何使用unique_ptr和make_unique正确声明对象数组
- 声明对象时,如何在C 中修复C2065错误
- 声明对象而不调用默认构造函数
- 一旦对象设置为 null,用于声明对象的堆大小的变量就设置为 null?
- 我可以使用名称而不是类型来声明对象文字吗?
- 在制作(Qt等)GUI时声明对象
- 在基本的GUI编程中,在哪里声明对象和方法
- 同时使用模板和参数声明对象
- "Undefined reference to"使用双模板类声明对象时出错
- 在头文件 C++ 中声明对象
- 在其类中声明对象
- C 可以通过使用要求其为某个类别的对象来声明对象
- 声明对象
- (C++)如何基于条件声明对象类成员
- 使用变量声明对象的名称
- C++ OOP 体系结构:决定是从基类声明对象还是继承基类
- 在声明对象之前在全局函数中使用类的成员函数