2015-11-03 124 views
2

当给定一个中等大小的文件(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

+0

是您在文本中滚动的文件,例如UTF-8文件? 我不得不问,因为这似乎很奇怪。我看了一下代码,它确实看起来很时髦。 –

+0

纯ASCII文本,并且没有超过5905字节的行。 – Ray

+0

这里不能重现(linux DMD64 2.069)。你是否通过另一个过程传递了输入(如Richard A.C所建议的)?如果是这样的话,进程必须关闭输入(例如,启动进程A,写入进程A输入,关闭进程A输入)是很有可能的。在控制台(例如'./test

回答

4

这是最有可能受到此问题的原因包括: https://issues.dlang.org/show_bug.cgi?id=13856

请尝试升级您的DMD到当前版本,它应该有固定的。

+0

这样做。我很惊讶这是一个实际的编译器错误;你不经常看到这些。 – Ray

相关问题