【问题标题】:Does 'new' cause a memory leak in Java? [duplicate]'new' 会导致 Java 中的内存泄漏吗? [复制]
【发布时间】:2017-09-11 23:14:38
【问题描述】:

当我在 C++ 中创建一个带有指针的新对象时,我需要在完成或将此指针移动到另一个对象时删除它以避免内存泄漏。 Java 中的new Some_Object 是这样工作的吗?

Some_Object o1 = new Some_Object("oj1");
o1 = new Some_Object("oj2");  // do this make memory leak in Java?

【问题讨论】:

  • 在 c++ 中,如果将使用 new 创建的对象分配给指针,然后将该指针指向其他地方,则除非您在其他地方对创建的对象有另一个引用,否则您已经泄漏了内存。
  • C++ 不是 Java。
  • 不是它不会泄漏内存。 java中的垃圾收集器非常可靠。您可以拥有的是资源泄漏(套接字、流保持打开状态)
  • 有一些方法,尽管在 Java 中内存可能会泄漏。请参阅有关该主题的广泛 SO 线程:stackoverflow.com/questions/6470651/…
  • 在 C++ 中,您不必使用 new 来创建对象。

标签: java c++ memory-leaks


【解决方案1】:

像 Java 这样的内存管理语言中的“内存泄漏”与在 C++ 中的含义并不完全相同,因为 Java 不要求您显式释放已分配的内存。

话虽如此,您可以通过基本相同的效果。观察者模式的集合类和实现往往是这方面的罪魁祸首。内存管理的后果之一是,如果 any 对象持有对某个对象的引用,则无论您是否打算再次使用该对象,该对象都将留在内存中。这可能导致对象在内存中停留的时间比必要的长得多(甚至可能在程序的持续时间内)。

如果您引用非托管对象,也可能会遇到问题。对此有许多可能的解决方案;例如,C# 使用 Dispose Pattern 解决了这个问题。但事实上,引入非托管对象可能会导致实际的内存泄漏。

【讨论】:

    【解决方案2】:

    简而言之,没有。 Java 有一个内置的(并且是强制性的)垃圾收集器。 C++ 没有。

    一旦Object 不再可访问(在 Java 中),它就有资格进行垃圾收集(并且收集器可以释放内存)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-23
      • 2021-09-25
      • 2014-12-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多