Я новичок в 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.Clear сканирование и установить его в нулевое значение, с/без использования 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.As размер массива большой (> 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