为什么此代码会产生 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 升级到当前版本,它应该已修复。
以下代码在给定一个中等大小的文件 (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 升级到当前版本,它应该已修复。