我是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