在C+中声明对象+;vs java 我已经用C++了,我正在学习java,
用java声明对象让我很困惑 我们用java编写在C+中声明对象+;vs java 我已经用C++了,我正在学习java,,java,c++,new-operator,Java,C++,New Operator,用java声明对象让我很困惑 我们用java编写 myclass myobject = new myclass(); myobject.mymethod(); 与C++中的代码相同吗? myclass *myobject = new myclass(); myobject->mymethod(); i、 e是在堆上分配的内存吗?如果它在堆上,为什么我们永远不会释放内存。我相信新的关键词是一样的。 如果是这样,我们如何在堆栈上分配内存 与C++中的代码相同吗? myclass *myob
myclass myobject = new myclass();
myobject.mymethod();
与C++中的代码相同吗?
myclass *myobject = new myclass();
myobject->mymethod();
i、 e是在堆上分配的内存吗?如果它在堆上,为什么我们永远不会释放内存。我相信新的关键词是一样的。
如果是这样,我们如何在堆栈上分配内存
与C++中的代码相同吗?
myclass *myobject = new myclass();
myobject->mymethod();
对。都一样
i、 内存是在堆上分配的吗
是的
如果它在堆上,为什么我们永远不会释放内存
当对象不再可访问时,允许它访问垃圾收集器。i、 e当没有对该对象的有效引用或(取消引用)
如果是这样,我们如何在堆栈上分配内存
当特定的线程执行开始时,与该线程相关的变量将被放置在堆栈上,并在该线程的作业完成后立即删除。每个线程都有自己的堆栈。正如您所想,new
操作符在堆上分配一个新对象。Java中的内存不会被显式释放——一旦对象不再具有访问根,它就有资格被释放。垃圾收集线程会周期性地释放此内存。但如果说此C++
代码是等效的,这并不是不准确的:
myclass* myobject = new myclass();
myobject->mymethod();
这也不完全一样
Java有一个垃圾收集器,因此,正如您所注意到的,您不必在Java
中释放对象
因此,与原始Java
更接近的可能是:
std::shared_ptr<myclass> myobject = std::make_shared<myclass>();
myobject->mymethod();
这样,在保持垃圾收集智能指针的安全性和便利性的同时,不会损失任何效率
参见:在阅读了这个问题的其他答案和其他一些文章后,我明白了
< C++和java代码都做了非常相似的事情,除了语法不同,java使用引用而不是指针(java没有指针)。
这里,
myclass-myobject代码>是myobject的声明
声明只是通知编译器我们将使用myobject引用类型为myclass的变量。它没有分配内存
newmyclass()代码>正在实例化对象(在堆中分配内存)并返回对该对象的引用。
它还通过调用构造函数myclass()初始化对象
澄清一个非常基本的疑问
inti代码>=>声明对象并在堆栈中为其分配内存
myclass-myobject代码>=>仅声明对象的引用变量(它还需要4个字节或8个字节,具体取决于系统)。它不分配实例变量存储的实际内存
换句话说,在为基本数据类型而不是非基本数据类型声明时分配内存。对于非基本数据类型,我们需要使用new关键字分配它们
为什么我们从不释放记忆
Java有一个垃圾收集器,它可以自动为我们做这件事
我们如何为堆栈中的对象分配内存
我们不能。堆栈中只能存储基本数据类型。new关键字返回指向堆中已分配内存的指针,对吗?但是java中没有指针…但是C++中的引用是不同的。我仍然不明白new关键字在做什么,以及如果总是在堆中分配内存,为什么需要调用new。“我们如何在堆栈上分配内存?”——在Java中,您不能(除了基本类型)。