Подтвердить что ты не робот

Родные и управляемые деструкторы

У меня есть собственный объект (С++), который имеет указатель gcroot для управляемого объекта (С#).

class SomeNativeClass {
    gcroot<SomeManagedClass ^> managedClass;
};

Вопрос Когда я удалю собственный экземпляр этого класса в собственном коде delete(someNativeClass), который я ранее выделил, будет ли экземпляр managedClass получить мусор, или я должен его явно удалить (в собственном деструкторе)?

4b9b3361

Ответ 1

Если удалять только собственный объект, а управляемый не упоминается нигде, будет ли это сбор мусора?

Это суть сбора мусора. Коллекционер уничтожает объект, когда он не может найти ссылку на объект. Это делается немного по-другому, когда вы используете класс gcroot < > template, "обычный" способ, с помощью которого коллекционер находит ссылки на управляемые объекты, обнаруживает их в регистрах процессора и стек управляемого кода и управляемой кучи. Это не может работать в собственном коде, класс gcroot < > помогает.

Конструктор gcroot < > вызывает GCHandle:: Alloc() для выделения явной ссылки на объект. Его деструктор вызывает GCHandle:: Free(), чтобы удалить его. Возможность выделения этих "ручек отслеживания" является вторичным механизмом в среде CLR, он поддерживает таблицу для них, которую коллекционер консультирует в дополнение к ссылкам, которые он находит.

Чистый эффект заключается в том, что при запуске деструктора класса он автоматически вызывает gcroot < > destructor. Ссылка на объект отсутствует. Если бы это была единственная ссылка, очень вероятно, что в этом случае следующий сборщик мусора уничтожит объект. Автоматически. Позже.