如何修复D“内存泄漏”

时间:2015-06-15 10:02:34

标签: memory-leaks d

所以我一直在寻找这个问题的解决方案。我编写了一个程序来从两个单独的文本文件中获取数据,解析它,并输出到另一个文本文件和一个ARFF文件供Weka分析。我遇到的问题是我编写的用于处理数据读取和解析操作的函数没有正确地解除分配内存。每次连续呼叫使用额外的100MB左右,我需要在功能过程中调用此功能超过60次。有没有办法迫使D去除内存,尤其是数组,动态数组和关联数组?

我的问题的一个例子:

Session

2 个答案:

答案 0 :(得分:4)

返回数据中的字符串是否仍指向原始文本文件?

D中的数组切片操作不会复制数据 - 相反,它们只存储指针和长度。这也适用于splitLinessplit,也可能适用于doSomeOtherCalculation。这意味着只要原始文件文本的子字符串存在于程序中的任何位置,就无法释放整个文件的内容。

如果您要返回的数据只是您正在阅读的文本文件大小的一小部分,则可以使用.dup制作字符串的副本。这样可以防止小字符串将整个文件的内容固定在内存中。

答案 1 :(得分:0)

如果调用后Collate()结果的内容重复,则很可能它不会被GC收集,因此当它不再使用时会驻留在内存中。如果是这样,那么您可以使用为每个Collate()重置的全局容器:

void Collate(out Datum[] data) {
    // data content is cleared because of 'out' param storage class
    // your processing to fill data
}