与FlxState.update函数中的迭代器的Haxe内存问题

时间:2015-07-08 07:36:18

标签: haxe haxeflixel

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

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调试器中的外观:

memorynornormal

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

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

没关系:

memorynormal

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

感谢。

1 个答案:

答案 0 :(得分: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;
  }
}

最终收集了记忆:

memorycollected