我无法让MmFile
在目录扫描算法中工作。
当我按照以下压力测试时
foreach (dent; dirEntries(..)) {
const size_t K = ...;
const ulong size = ...;
scope auto mf = new MmFile(dent.name, MmFile.Mode.read, size, null, win)
}
在找到数据时,我无法找到适用于所有情况的size
和win
的组合。
当我设置
const size = 0;
const win = 64*1024;
正确计算长度。
但当dent.name
是现有的空文件时,它会在MMFile
抛出
core.exception.FinalizeError...std.exception.ErrnoException@std.mmfile.d(490): munmap failed (Invalid argument).
我无法通过捕获core.exception.FinalizeError
来恢复此错误,因为它在析构函数中抛出。我还没试过
try { delete mm; } catch (core.exception.FinalizeError) { ; /* pass */}
也许这样有用。
这是在现有空文件的C中调用mmap
时的默认行为吗?
如果是这样,我认为MmFile应该在施工期间检查这个错误。
当我用显式scope
替换delete
时,也会抛出异常。
现在我只是跳过在空文件上调用MmFile
。
答案 0 :(得分:1)
MmFile
对空文件进行barf操作听起来像是一个错误,无论mmap
本身做什么。 Please report it
在旁注中,我建议不要使用scope
或delete
,因为它们将从语言中删除,因为它们都不安全。如果您想这样做,std.typecons.scoped会在此上下文中替换scope
(尽管它仍然不安全)。至于delete
,destroy
会在没有释放内存的情况下销毁对象,如果真的想要,core.memory
可用于释放内存,但是一般来说,如果你想担心释放内存,那么你应该手动管理你的记忆(malloc
和free
,可能emplace
),而不是使用GC。< / p>