C# 使用双精度阵列时内存泄漏

C# 使用双精度阵列时内存泄漏,c#,memory-management,C#,Memory Management,我有一部分代码在大型的double(至少包含6000个元素)数组上运行,并执行数百次(通常为800次) 当我使用标准循环时,如下所示: double[] singleRow = new double[6000]; int maxI = 800; for(int i=0; i<maxI; i++) { singleRow = someObject.producesOutput(); //... // do something with singleRow // ... } double[]

我有一部分代码在大型的
double
(至少包含6000个元素)数组上运行,并执行数百次(通常为800次)

当我使用标准循环时,如下所示:

double[] singleRow = new double[6000];
int maxI = 800;
for(int i=0; i<maxI; i++)
{
singleRow = someObject.producesOutput();
//...
// do something with singleRow
// ...
}
double[]单行=新的双行[6000];
int maxI=800;

对于(int i=0;i使
singleRow
成为一个参数,并在每次调用
producesOutput
时将其传递给该调用


基本上,您的
producesOutput
方法可能每次都分配一个新数组,而
singleRow
的重新分配只是将旧内存标记为可删除,但出于性能原因,不会运行GC。

为什么分配一个大的空
singleRow
只是为了覆盖它?也许您应该uld正在传入数组,以便修改其值。这将允许您重新使用它

double[] singleRow = new double[6000];
int maxI = 800;
for(int i=0; i<maxI; i++)
{
    someObject.FillWithOutput(singleRow);
    //...
    // do something with singleRow
    // ...
}
double[]单行=新的双行[6000];
int maxI=800;

对于(int i=0;i你不会喜欢这样,但是如果你不得不强制GC,你就做错了。请记住,内存可能会增长,直到有压力触发GC-这是一件好事,因为这意味着GC在不得不运行之前不会运行


下面是一个听起来很愚蠢的测试,但它可能会让我们了解正在发生的事情注释掉它的大部分功能。然后运行循环并测量memeory。逐步取消注释掉其中的一部分,直到看到一个光点。现在,您越来越接近导致“泄漏”的原因。

如果可能的话,我想看看您在获得阵列后如何处理它,以及producesOutput如何工作。如果阵列是固定长度的。可以说,
ref
不会造成直接伤害,并且会显示修改参数的意图。不过,我认为这样做是不对的。@Steven,使用ref似乎更清楚一点。@John,谢谢你的帮助。遗憾的是,我不能接受两个答案;)嗯,
ref
如果数组被另一个数组替换,而不是就地修改,那么就需要
ref
了。因为你真的想就地修改,所以
ref
可能会产生误导。更深层次的困惑是,它允许方法做一些它实际上从来没有做过的事情。(我也投票支持John的答案。)我需要检查在我们的项目中使用的约定。我想我会给ref留下一个适当的注释来解释用法。
double[] singleRow = new double[6000];
int maxI = 800;
for(int i=0; i<maxI; i++)
{
    someObject.FillWithOutput(singleRow);
    //...
    // do something with singleRow
    // ...
}