为什么此代码会产生 InvalidMemoryOperationError?

Why does this code produce an InvalidMemoryOperationError?

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

import std.stdio;

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

我找到的所有文档[例如1, 2] 表明当分配发生在垃圾收集周期期间时(例如,如果内存是在析构函数中分配的),就会发生此错误。但是这里唯一应该分配的是line,它的类型是char[],大概没有析构函数。

此外,由于 byLine() 返回的值在调用 popFront() 后不应该保留 [3],我很好奇为什么它甚至分配足够的内存给需要 收集通行证。使用 byLine 而不是 byLineCopy 的全部意义不是重用缓冲区的能力,只在必要时增加它吗?

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

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

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