为什么此代码会产生InvalidMemoryOperationError?

时间:2015-11-03 04:03:55

标签: garbage-collection d

当给出一个中等大小的文件(251MB)作为输入时,以下代码与错误core.exception.InvalidMemoryOperationError@(0)崩溃,但是当给定小文件时则不会。

import std.stdio;

void main(string[] argv) {
    foreach(line; stdin.byLine()) {}
}

我发现的所有文件[例如12]表示在垃圾收集周期中发生分配时会发生此错误(例如,如果在析构函数中分配内存)。但是,唯一应该在这里分配的是line,它的类型为char[],可能没有析构函数。

此外,由于byLine()返回的值在调用popFront()[3]后不应该持久存在,我很好奇为什么它甚至为需要一个集合传递。使用byLine而不是byLineCopy的重点不是重用缓冲区的能力,只在必要时增长它吗?

我的编译器版本是DMD64 D Compiler v2.067.1

1 个答案:

答案 0 :(得分:4)

这很可能是由这个错误引起的: https://issues.dlang.org/show_bug.cgi?id=13856

请尝试将您的DMD升级到当前版本,应该在那里修复。