我是C#的新手。最近当我更新应用程序(vs2008)时,我遇到了以下问题。C++/C#数组内存异常
应用程序有C++函数帮手如下:
array<float>^ Variant::CopyToFloats()
{
unsigned int n = this->data_uint8->Length;
array<float>^ dst = gcnew array<float>(n); //<<OutOfMemoryException happened here
for (unsigned int i = 0; i < n; i++)
dst[i] = (float)this->data_uint8[i];
return dst;
}
在C#中的文件,
for(int i=0; i<m; i++)
{ for(int j=0; j<n; j++)
{
float[] scan = data[i].CopyToFloats();
for(int k=0; k<nn; k++)
sample[k]=scan[function(i,j)];
}
}
当我运行应用程序,OutOfMemoryException异常情况发生。
然后添加以下代码
Process proc = Process.GetCurrentProcess();
long memory = proc.PrivateMemorySize64;
之前和外环后,我发现扫描的存储器未释放。
我尝试以下方法:
1.清除扫描,并将其设置为null,有/无使用GC.Collect的()
for(int i=0; i<m; i++)
{ for(int j=0; j<n; j++)
{
float[] scan = data[i].CopyToFloats();
for(int k=0; k<nn; k++)
sample[k]=scan[function(i,j)];
}
Array.Clear(scan, 0, scan.Length);
scan = null;
//GC.Collect();
}
随着调用GC.Collect的(),程序跑得很慢。 没有调用,程序仍然崩溃为OOME。
我想知道哪些内存没有发布?扫描或阵列由gcnew创建?
2.由于数组大小很大(> 500000),我在进入循环之前分配大尺寸数组。
float[] scan = new float[data[0].GetSize()];
for(int i=0; i<m; i++)
{ for(int j=0; j<n; j++)
{
scan = data[i].CopyToFloats();
for(int k=0; k<nn; k++)
sample[k]=scan[function(i,j)];
}
}
但OOME仍然发生。从这里开始,我确信由gcnew创建的数组的内存没有被释放。我对吗? 如果我是对的,为什么它没有发布?有什么办法可以释放这个内存吗? 如果我不对,请给我一些建议,谢谢!
感谢您的咨询! – yongqiang 2013-05-11 21:42:39