2017-02-07 4 views
0

У меня есть опыт работы на C и C++ (языки без GC), но совсем недавно с помощью C# много. У меня есть вопрос, на который я думаю, что получил ответ, но я хочу, чтобы кто-то подтвердил меня или исправил меня (если я ошибаюсь).Управление массивами в C# (управление памятью)

Скажем, у меня есть следующие

int[,] g = new int[nx, ny];

очень легко. Это просто отделяет память для 2D-массива int. После этого я могу использовать его, если я не превзойду nx или ny как пределы массива.

Теперь предположим, что я хочу сделать это несколько раз но с разными Nx-х, ​​и каждый раз повышение эффек (как это новые значения вычисляются не имеет значения)

, так что я бы

int[,] g; 

for(k=0;k<numberOfTimes;k++) 
{ 
//re-calculate nx and ny 


g = new int[nx, ny]; 

//work with g 


} 

обычно я думаю, что каждый раз, когда я отделяю память от g, я оставляю пропущенную память, которая никогда не будет достигнута. Очевидно, мне придется «удалить» это. Но так как C# имеет сбор мусора, могу ли я сделать выше с безнаказанностью ??

Другими словами, мой код выше достаточно безопасен?

любое предложение, чтобы улучшить его?

+0

Это прекрасно, как вы это делаете. Просто убедитесь, что любые нелокальные поля, содержащие ссылку на этот массив (если есть), установлены в нуль или заменены ссылкой на новый массив. Если у вас есть, скажем, статическое поле, которое ссылается на массив, очевидно, память будет сохранена, пока эта ссылка еще доступна. –

+0

Короткий ответ: если вы не имеете дело с неуправляемыми ресурсами или выделяете объекты, которые действительно большие, вам обычно не приходится беспокоиться о утечке памяти на C#. – Abion47

ответ

3

Ваш код является достаточно безопасным.

GC собирает только те объекты в куче, которые не имеют ссылок на стек, указывающие на них. Как и в вашем сценарии, переменная в области цикла for получает другую ссылку, предыдущий массив теряет все доступные ссылки на нее и, таким образом, собирается через некоторое время.

Кроме того, нет необходимости объявлять переменную во внешней области, поскольку она оптимизирована позже во время компиляции. Подробнее об этом: here

Смежные вопросы