MmFile Empty Files在析构函数中抛出异常

时间:2013-09-19 10:51:21

标签: exception scope d mmap

我无法让MmFile在目录扫描算法中工作。

当我按照以下压力测试时

foreach (dent; dirEntries(..)) {
    const size_t K = ...;
    const ulong size = ...;
    scope auto mf = new MmFile(dent.name, MmFile.Mode.read, size, null, win)  
}

在找到数据时,我无法找到适用于所有情况的sizewin的组合。

当我设置

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

1 个答案:

答案 0 :(得分:1)

MmFile对空文件进行barf操作听起来像是一个错误,无论mmap本身做什么。 Please report it

在旁注中,我建议不要使用scopedelete,因为它们将从语言中删除,因为它们都不安全。如果您想这样做,std.typecons.scoped会在此上下文中替换scope(尽管它仍然不安全)。至于deletedestroy会在没有释放内存的情况下销毁对象,如果真的想要,core.memory可用于释放内存,但是一般来说,如果你想担心释放内存,那么你应该手动管理你的记忆(mallocfree,可能emplace),而不是使用GC。< / p>