java - 在方法内部创建的对象

标签 java c++ memory-management heap-memory

我想知道本地方法中实例化的对象存储在哪里?据我所知,对象存储在堆中,它们的引用存储在堆栈中。如果是这样,那么当函数返回时,对对象的引用不再存在(因为函数的本地堆栈帧被弹出),该对象是否留在堆中,或者我们是否必须手动删除它(或使用垃圾收集,如 Java 中那样)?

最佳答案

这取决于您打算如何处理该对象,如果您返回该对象,那么它的生命周期就会延长。如果您将其创建为临时的,则有两种可能的结果。

  1. 如果使用new创建对象。如果您创建一个指向新对象的指针,那么当该方法超出范围时,该指针将被删除。但该对象仍然会导致内存泄漏,需要显式删除该对象。

  2. 如果您不使用new。当作用域结束时,该对象将被删除。

这两种结果都假设您不返回该对象,并且在函数中将其实例化为临时对象。

这里是一些示例代码:

class ObjectClass {
public:
        ObjectClass() {}

};

void myFunction() {
        ObjectClass my_obj(); //memory is handled for you
        ObjectClass * my_dynamic_obj = new ObjectClass();
        delete my_dynamic_obj; //if delete is not called then
        // the pointer my_dynamic_obj will be deleted but the object itself will remain
        return;
}

main() {
        myFunction();
        return 0;
}

关于java - 在方法内部创建的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40931721/

相关文章:

c++ - "Error C1083: Cannot open source file"根本不应该寻找文件

c++ - 为什么必须在哪里放置 “template”和 “typename”关键字?

c++ - 如何使用 C++ 在 LUA 中编写具有对话和菜单的交互式 NPC 脚本?

c - malloc 大量数据来填充 ram 并观察自由参数

memory-management - 将逻辑地址转换为物理地址

java - 使用 javascript 检索 GSM 小区 ID、mcc、mnc

java - 什么时候适合导入包?

JAVA:如何获取证书(crt)文件的 keystore 文件

c++ - move 分配时左侧 std::vector 资源会发生什么情况?

java - ArrayIndexOutOfBoundsException - 命令行参数