當給定一箇中等大小的文件(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