在 C++ 中声明对象 vs 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 上分配的吗?如果它在堆上,为什么我们从不释放内存。我相信 new 关键字是相同的。 如果是这样,我们如何在堆栈上分配内存?

Is it same as this code in c++ ?

是的。一样的。

i.e is the memory getting allocated on heap?

是的。

If it is on heap why we never free the memory.

当对象不再可访问时,允许对象进入垃圾收集器。即当没有对该对象的有效引用或(取消引用)

If so, how do we allocate memory on stack?

当特定线程开始执行时,与该线程相关的变量将被放置在堆栈中,并在该线程的作业完成后立即被删除。每个线程都有自己的堆栈。

如您所想,new 运算符在堆上分配了一个新对象。 Java 中的内存未明确释放 - 一旦对象没有更多访问根,它就有资格被释放。垃圾收集线程将定期释放此内存。

虽然说这个 C++ 代码是等价的并不准确:

myclass* myobject = new myclass();
myobject->mymethod();

也不完全一样

Java 有一个 垃圾收集器 因此,正如您所注意到的,您不必释放 Java.[=21= 中的对象]

所以更接近原始 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 关键字分配它们。

Why we never free the memory?

Java 有垃圾收集器自动为我们做。

How do we allocate memory for objects in stack?

我们不能。堆栈中只能存储原始数据类型。