1

在将数据结构从diffarray 更改vector之后,在 QuickCheck测试之一期间内存会爆炸(无限增长)。

代码托管在GitHub 上。dev 分支包含不良代码,而 master 分支运行良好。除了微小的更改之外,唯一可能对此产生任何影响的提交就是这个。为了运行 QuickCheck 例程,应该运行可执行测试器。看起来小长度的向量不会使程序崩溃,但是当它变得更长时,程序会变慢并最终炸毁内存。让我感兴趣的另一件事是,在渲染 XML 文件时,我在其他库中遇到了类似的问题。对于小文件(<400k),它运行缓慢但没有崩溃,对于较大的文件,内存会爆炸。Data.Vector 也包含在该库中。我有直觉这些问题是相关的。

编辑:我终于隔离了重现内存泄漏的代码部分,并将其放入一个文件中,可以在此处找到。现在我正在使用与 DiffArray 一样好用的 IArray。要在 IArray 和 Vector 之间切换,必须修改第 49、93 和 101 行。

4

1 回答 1

2

已解决实际上问题出在 QuickCheck 生成向量上。Vector 的原始 Arbitrary 实例如下:

instance (Arbitrary a) => Arbitrary (Vector a) where
  arbitrary   = liftM2 Vec.generate arbitrary arbitrary

编译但会导致内存泄漏。如果向量是从列表中生成的,则可以解决该问题。像这样:

instance (Arbitrary a) => Arbitrary (Vector a) where
  arbitrary = Vec.fromList <$> arbitrary

我仍然不知道这种错误的原因是什么......

于 2012-03-21T14:23:36.133 回答