[入门] 栈上数组陷阱

qiezi 2008-04-06
import std.stdio;
import std.stream;

void main() {
  char[char[]] map;
  File file = new File(__FILE__);
  
  while(!file.eof()) {
    char[128] buf;
    char[] line = file.readLine(buf);
	if (line.length < 5) continue;
    char[] token = line[0..5];
    map[token] = 1;
	writefln("token: ", token, ", value: ", 1);
  }

  foreach(k, v; map)
    writefln("key: ", k, ", value: ", v);
}


运行结果会看到map的所有key都相同,但却有许多key。

这个陷阱在std.stream.Stream.opApply里面也存在:

void main() {
  InputStream stream = xxx;
  foreach(line; stream) {
    map[line[0..5]] = 1;
  }
}

opApply里面在栈上分配了个128个元素的数组,当一行长度小于等于128字节时,line数组指向栈空间;当长度超过128时,数组会重新在堆上分配,就没有这个问题了。
oldrev 2008-04-07
越来越觉得还是 tango 靠谱
Global site tag (gtag.js) - Google Analytics