当给定一个中等大小的文件(251MB)作为输入时,下面的代码崩溃,并且出现错误[email protected](0)
,但是当给定小文件时不会。为什么此代码会产生InvalidMemoryOperationError?
import std.stdio;
void main(string[] argv) {
foreach(line; stdin.byLine()) {}
}
我找到的所有文档[例如1,2]表明,在垃圾收集周期内发生分配时(例如,如果内存在析构函数中分配),会发生此错误。但是这里应该分配的唯一东西是line
,它的类型为char[]
,这大概没有析构函数。
此外,由于通过署名()返回的值不应该popFront()之后持续被称为上[3],我很好奇,为什么它甚至分配足够的内存来需要集合通过。是不是使用byLine而不是byLineCopy重新使用缓冲区的能力,只是在必要时才增长缓冲区?
我的编译器的版本是DMD64 D Compiler v2.067.1
是您在文本中滚动的文件,例如UTF-8文件? 我不得不问,因为这似乎很奇怪。我看了一下代码,它确实看起来很时髦。 –
纯ASCII文本,并且没有超过5905字节的行。 – Ray
这里不能重现(linux DMD64 2.069)。你是否通过另一个过程传递了输入(如Richard A.C所建议的)?如果是这样的话,进程必须关闭输入(例如,启动进程A,写入进程A输入,关闭进程A输入)是很有可能的。在控制台(例如'./test