【问题标题】:Objects created inside a method在方法内创建的对象
【发布时间】:2017-04-17 08:03:05
【问题描述】:

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

【问题讨论】:

  • 您问的是 C++ 还是 Java?选择一个,然后从您的问题中删除另一个标签。 C++ 对象和 Java 对象根本不同。适用于一个的答案不会适用于另一个。不要垃圾标签。
  • 获得两者的答案会很有帮助。
  • 对于java:只有一种方法可以实例化对象&不管你在哪里做,结果总是一个无法手动删除的对象。引用也可以存储在堆中:当对象引用其他对象时(我猜这也发生在 C++ 中)

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


【解决方案1】:

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

  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;
}

【讨论】:

  • 有没有办法不用new就可以创建对象?
  • 是的,只需以标准方式创建它们。例如。 ObjectClass my_obj()。我假设您来自 Java,使用 new 可能很危险,因为如果不删除对象可能会导致内存泄漏。给我 10 分钟,等我到电脑后整理答案
  • 我指示我的团队永远不要使用newdelete。自动存储始终是首选。当您真的需要动态存储时,请使用正确类型的智能指针。显然每条规则都有例外,但需要有经验的开发人员负责任地打破规则,而更有经验的开发人员才能正确地打破规则。
猜你喜欢
  • 1970-01-01
  • 2017-01-15
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 2014-12-06
  • 1970-01-01
  • 1970-01-01
  • 2021-01-16
相关资源
最近更新 更多