在 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()
这样您就不会损失任何效率,同时仍然保持 垃圾收集 智能指针的安全性和便利性。
看完这个问题的其他答案和其他一些文章后,我明白了,
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?
我们不能。堆栈中只能存储原始数据类型。
我已经使用 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()
这样您就不会损失任何效率,同时仍然保持 垃圾收集 智能指针的安全性和便利性。
看完这个问题的其他答案和其他一些文章后,我明白了,
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?
我们不能。堆栈中只能存储原始数据类型。