2015-11-03 163 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

相關問題