Я новичок в С#. Недавно, когда я обновляю приложение (vs2008), я столкнулся со следующей проблемой.
Приложение имеет вспомогательную функцию С++ следующим образом:
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;
}
В файле С#,
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, не была освобождена. Я прав? Если я прав, то почему его не выпустили? Есть ли способ освободить эту память? Если я не прав, дайте мне совет, спасибо!