Architecture Net



         

Управляемые и неуправляемые ссылки и типы значений - часть 2


В нашем конкретном примере оператор delete (удалить) используется в последней строке для удаления объекта pmcobj, и комментарий утверждает, что "удалять обычно не требуется, но здесь необходимо". Оператор delete (удалить) добавлен в последнюю строку программы не потому, что непосредственная очистка требуется для управляемого объекта (сборщик мусора это сделает и без нас), а добавлен он из временных соображений. Это сделано потому, что вызов Console:: WriteLine в деструкторе управляемого класса в противном случае производился бы в самом конце выполнения программы, уже после того, как выходной поток Console (Консоль) был бы закрыт. Другими словами, если бы деструктор не был вызван явно оператором delete (удалить), управляемый объект попытался бы выполнить вывод в несуществующий поток, что вызвало бы исключение (System.ObjectDisposedException: Cannot access a closed Stream — Нельзя обращаться к закрытому потоку). Это демонстрирует наиболее общую причину явного удаления управляемого объекта, которая заключается в том, что иногда требуется явно указать момент разрушения объекта.


Хотелось бы еще обратить внимание на то, что компилятор обрабатывает примитивные типы данных (такие как int, float (с плавающей точкой), double (с удвоенной точностью), char (символ), и т.д.) не так, как управляемые классы сборщика мусора (_дс) или структуры сборщика мусора (_дс), потому что примитивные типы всегда являются типами значений.

//ManagedAndUnmanagedRefAndValTypes.срр

fusing <mscorlib.dll>

using namespace System;

// использование пространства имен Система;

_gc class ManagedClass

// класс сборщика мусора ManagedClass

{

public:

ManagedClass()

{

Console::WriteLine("ManagedClass");

}

^ManagedClass()

{

Console::WriteLine("~ManagedClass");

}

};

_nogc class UnmanagedClass

{

public:

UnmanagedClass()

{

Console::WriteLine("UnmanagedClass"); }

-UnmanagedClass() (

Console::WriteLine("-UnmanagedClass"); } };

void main(void) {

ManagedClass *pmcObj = new ManagedClass();

//ManagedClass mcObj; // ошибка, тип значения, не допустим

UnmanagedClass *pumcObj = new UnmanagedClass() ;

delete pumcObj;

// требуется удалить из-за отсутствия сборки мусора

UnmanagedClass umcObj; // нет ошибки, тип значения допустим

int i = 3;

// нет ошибки, тип значения допустим для примитивных типов 'delete pmcObj;

// удалять обычно не требуется, но здесь необходимо

}

Вот что выведет приведенный пример программы:

ManagedClass UnmanagedClass

-UnmanagedClass UnmanagedClass

-ManagedClass

-UnmanagedClass

CompEbook.ru Железо, дизайн, обучение и другие




Содержание  Назад  Вперед