0

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 */}

也许这行得通。

这是mmap在现有空文件上调用 C 时的默认行为吗?

如果是这样,我认为 MmFile 应该在构建过程中检查此错误。

当我scope用明确的delete.

现在我只是跳过调用MmFile空文件。

4

1 回答 1

1

对我来说这听起来像是一个错误,MmFile不管mmap它本身是做什么的,都会对空文件大喊大叫。请报告

在旁注中,我建议不要使用scopeor delete,因为它们将从语言中删除,因为它们都是不安全的。如果您想这样做,std.typecons.scoped将在此上下文中替换(尽管它仍然不安全)。scope至于delete,destroy会在不释放内存的情况下销毁对象,如果你真的core.memory想的话可以用来释放内存,但一般来说,如果你想担心释放内存,那么你应该手动管理你的内存(用并且可能)并且根本不使用GC。mallocfreeemplace

于 2013-09-19T19:25:16.560 回答