我有一个问题,现在一直困扰着我几天。我试图谷歌这个问题,但到目前为止还没有找到任何解决方案,甚至没有一个人有同样的问题。C#System.Buffer.BlockCopy内存问题?
看来,C#方法System.Buffer.BlockCopy留给你一些内存鬼魂。我有例如这种方法:
private float[,] readFloatArray2 (byte[] b) {
int floatSize = sizeof(float);
float[,] v = new float[2, (b.Length/2)/floatSize];
System.Buffer.BlockCopy(b, 0, v, 0, b.Length);
return v;
}
将字节数组转换为2D浮点数组。数据先前从流中读取。 我找到了问题是System.Buffer.BlockCopy方法。
如果我删除了BlockCopy命令,则应用程序使用的内存将减半。这意味着它不是我的错,即字节数组仍然存在。因为没有BlockCopy命令,字节数组就会正常死亡。浮动数组无论如何被创建(有或没有复制的信息)。
我不太确定这是BlockCopy命令还是GC的问题,因为我也尝试调用System.GC.Collect(); BlockCopy之后,然后它也可以完美运行(我知道你不应该这样做...这就是为什么我要求在这里建议)。
我也不会打扰问,但问题涉及几百兆。
除了内存问题,该方法工作得很好。有谁知道是什么导致了内存问题?
的问候和感谢事先 OLI
PS:我使用的.NET4.0与Visual Studio 2010 PRO和WIN7 ...不知道这是否是相关或不。
如果你说这个内存被一个'GC.Collect'正确收集,那么一切都很好。当时间到时,'b' *将最终由普通的GC收集。 – 2012-01-03 10:11:09
如果您正在处理音频数据,我会使用形式为float [len] [channelCount]'的锯齿状数组。这样你可以分开处理通道,这有时候很有用。 – CodesInChaos 2012-01-03 11:07:22
“浮点数组无论如何被创建”只有一半是真的。它不一定需要物理内存。内存页面全部为0,并且从未被写入,它们都由Windows内存管理器优化。 – CodesInChaos 2012-01-03 11:09:53