【问题标题】:Should values in an array stack be dereferenced?是否应该取消引用数组堆栈中的值?
【发布时间】:2014-01-07 04:57:47
【问题描述】:

假设我有一些使用数组来存储值的堆栈实现。弹出时,是否可以简单地更改我的“指针”值所指的位置,还是应该将当前数组位置设置为 null?

public T pop() {
    size--;
    return stack[size];
}

对比

public T pop() {
    size--;
    T result = stack[size];
    stack[size] = null;
    return result;
}

【问题讨论】:

  • 你应该设置为null
  • 为什么?功能正常的数组堆栈不会阻止用户访问弹出的值而不将它们设置为 null 吗?
  • 您的下一个 pop()top() 将返回下面的元素,但您保留了对之前存在的对象的引用,因此它不能被垃圾回收。

标签: java arrays stack


【解决方案1】:

如果您不设置为null,堆栈仍将保存对先前在堆栈中的对象的引用。它可能导致内存泄漏,因为只要有对象持有对对象的引用,垃圾收集器就不会释放内存。

所以,将stack[size] 设置为null

【讨论】:

  • 那么程序中不再使用的数组也应该被销毁吗?内存泄漏只能是数组的大小,假设我在poppking后push一个值,就不再有泄漏了。
  • 内存泄漏是你保存在内存中的大小。如果在stack[size] 引用的对象是一个大对象,它本身可能引用其他对象,那么它就是一个大内存泄漏。
  • 当然,如果你再推,它会删除引用。但谁知道是否有人要推动呢?在编写 Stack 容器时,通常不能对将如何使用它做出任何假设。当然,如果它只是一个玩具实现,那么它不是很重要,但如果你想学习如何正确编写它,你必须防止潜在的滥用。
【解决方案2】:

您可能应该将它们设置为 null。垃圾收集基于引用计数,如果您将它们留在堆栈中,但无法访问(您建议不设置 null),GC 不知道它们已从堆栈中“弹出”。

设置为 null 将允许 GC 做它的事情

【讨论】:

    猜你喜欢
    • 2012-04-10
    • 2014-12-03
    • 2015-07-26
    • 2012-12-17
    • 2017-11-21
    • 2020-10-01
    • 2017-09-06
    • 2016-06-28
    • 2015-08-22
    相关资源
    最近更新 更多