1

每当我在更新循环中使用迭代器时,我都会遇到内存泄漏问题。例如,这里:

class Manager extends FlxState {
  public var array: Array<Int>;
  override public function create():Void {
    array = new Array();
  }

  public override function update() {
    super.update();
    /////////////////////////////////////////////////////
    //
    // ISSUE IS HERE
    // If for(item in array) line is present there's a memory
    // issue.
    //
    /////////////////////////////////////////////////////
    for(item in array) var noop:Int = 0 /* Do nothing */;
  }
}

运行此程序时,我将获得持续不断的内存增加。这是它在 HaxeFlixel 的调试器中的样子:

记忆正常

但是,如果我使用这样的简单循环进行迭代:

for(i in (0...array.length)) var noop:Int = 0;

没事的:

记忆正常

为什么会发生这种情况,我做错了什么?

谢谢。

4

1 回答 1

1

这是因为迭代器正在为迭代器分配内存。

一段时间后,内存被垃圾收集器收集。

我使用 1000 个数组进行了压力测试

class Manager extends FlxState {
  public var arrays: Array<Array<Int>>;
  override public function create():Void {
    arrays = new Array();
    for (i in (0...1000)) arrays.push(new Array());
  }

  public override function update() {
    super.update();
    for (array in arrays)
      for (i in array)
        var noop:Int = 0;
  }
}

最终收集了内存:

记忆收集

于 2015-07-08T08:26:55.180 回答