2015-04-15 4 views
1

Прежде чем сообщить мне, что я задал часто задаваемый вопрос, выслушайте меня.Как удалить или повторно инициализировать новую переменную?

Я пишу программу для чтения из регистратора данных с использованием форм C# и окон. Каждый из каналов может означать разные вещи, такие как подъем, перетаскивание и давление. Я планирую настроить эти каналы. Вот как инициализируется такой канал:

private Channel Lift_Channel = new Channel(1); 

Это инициализирует Lift_Channel как объект канала, который ссылается на канал 1 на регистраторе.

Однако метод конструктора Channel (int) является единственным методом, который я могу использовать для установки канала. Если я хочу, чтобы Lift_Channel указывал на канал 2, я хотел бы сделать что-то вроде этого.

delete Lift_Channel; 
Lift_Channel = new Channel(2); 

Я чувствую, что если я не могу удалить Lift_Channel затем воссоздать его, я буду иметь ошибки утечки памяти, потому что канал (1) данные будут плавающие вокруг.

Любые идеи?

+0

Если вы приехали с C++, я понимаю, почему вы задали этот вопрос. В C# управление памятью (за некоторыми исключениями) заботится о вас. –

+0

Что именно происходит при вызове 'new Channel (1)'? Какой-то другой ресурс получает где-то? Если ресурс является неуправляемой памятью, тогда стандартная задача - реализовать реализатор канала IDisposable и деструктор. –

+0

@mikez C# не имеет деструкторов. У него есть финализаторы. –

ответ

3

Нет, ничего не нужно удалить. После его повторного назначения Lift_Channel больше не будет указывать на старый адрес памяти, и память будет очищена.

1

. Net мусор собирает выделенные предметы, которые больше не могут быть достигнуты. коллекция. Сборщик мусора периодически запускается и восстанавливает память для объектов, которые недоступны ни для чего другого.

При назначении через новый new память, ранее связанная с переменной (до переназначения), больше не будет доступна (предполагается, что эта переменная была единственной ссылкой на нее). Таким образом, старый объект становится недоступным, тогда сборщик мусора забирает его в следующий раз.

Следовательно, нет оператора delete.

  1. Вы можете присвоить NULL переменной, чтобы сделать его недоступным или
  2. вы можете назначить новую объектную ссылку на переменную.
  3. Наконец, вы можете использовать интерфейс IDisposable для обеспечения удаления в конце блока кода.

Все эти действия обеспечивают эффект удаления. (В конце концов, если элемент недоступен, он будет «удален при запуске сборщика мусора»).

3

В C++ любой объект, выделенный в куче, должен быть удален или он будет утечка памяти. В типичном управляемом .NET приложении который использует только управляемый код, разработчикам не нужно беспокоиться об удалении объекта, когда он выполняется с ним. Это связано с тем, что .NET имеет очень хороший и эффективный сборщик мусора. Он отслеживает все ссылки на объекты и когда последний ссылка на объект больше не действительна, а затем сама удаляет объект. Сборщик мусора обычно работает примерно в то же время, что и ошибка страницы памяти, поэтому он довольно эффективен.

Бывают случаи, когда вы можете необходимо реализовать некоторый код для обработки очистки объекта, если он использует неуправляемые код. .NET предоставляет интерфейс для этого: IDisposable. Основная идея этого заключается в том, что код, создающий объект для вызова метода Dispose для выполнения очистки. Если кто-то забывает это сделать, сборщик мусора в конечном итоге вызывает ваш метод финализатора как отказоустойчивый.Финализатору необходимо выполнить вызов метода Dispose. Пример этого показан в приведенной выше ссылке.

Сборщик мусора (GC) запускается автоматически в фоновом режиме и останавливает все активные управляемые потоки до того, как он выполнит какую-либо очистку. Часть этой работы по очистке включает сжатие памяти, и она может перемещать память. Если у вас есть вызовы в неуправляемый код, который использует указатели или ссылки на управляемые данные, тогда эти данные должны быть закреплены в памяти, чтобы GC не перемещал его. Это можно сделать с помощью оператора Fixed для использования в рамках данного метода или метода GCHandle.Alloc для более длительных периодов времени, которые могут использоваться вне метода, в котором он был объявлен. Метод GCHandle Free должен быть вызван для освобождения булавки. Для фиксации памяти требуется, чтобы код был помечен как небезопасный.

.NET предоставляет класс под названием GC, который может использоваться для управления сборщиком мусора. Например, если у вас есть объекты, которые используют большое количество памяти и хотите ждать памяти, который будет выпущен перед началом работы, то следующие методы должны быть призваны сделать это после установки их в нуль:

GC.Collect(); 
GC.WaitForPendingFinalizers(); 
Смежные вопросы