在c++和java中声明对象

declaring objects in C++ vs java

本文关键字:声明 对象 java c++      更新时间:2023-10-16

我已经使用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有垃圾收集器,它会自动为我们做这些。

如何为堆栈中的对象分配内存?

我们不能。