Класс C ++ / CLI ref не освобождается - PullRequest
0 голосов
/ 24 мая 2011

У меня есть неуправляемый класс и класс ref, который логически связан:

public ref class RefBlah
{
   ~RefBlah();
   !RefBlah();

   internal:

   UnManagedBlah* m_unmanaged;
}

public class UnManagedBlah
{
    public:
    gcroot<RefBlah^> refBlah;
}

Класс RefBlah всегда создает экземпляр UnManagedBlah , который содержит ссылку на объект, который его создал.

Теперь, когда я создаю экземпляр RefBlah в приложении C #, он просто не освобождается, когда выходит из области видимости. (Я ждал и видел, как все другие объекты освобождаются, но он отказывается удалить себя).

Насколько я знаю, если бы они оба были обычными объектами .Net, они оба были бы собраны, когда класс выйдет из области видимости, потому что, хотя счетчик ссылок не достигает 0. И это потому, что нет корня ссылки на объекты из основного стека.

.NET GC по-разному относится к ссылкам из неуправляемых классов?

Как изменить дизайн так, чтобы RefBlah был уничтожен?

1 Ответ

3 голосов
/ 24 мая 2011

Я думаю, что у вас есть проблема с циклической ссылкой. RefBlah не получит GC'd, пока ссылка в UnManagedBlah не станет GC'd, что произойдет, только когда вы удалите указатель в RefBlah и т.д ..

Если вам нужна ссылка внутри неуправляемого класса, возможно, это слабая ссылка? Взгляните на структуру GCHandle:

Класс GCHandle используется с Перечисление GCHandleType для создания ручка, соответствующая любому управляемому объект. Эта ручка может быть одной из четырех типы: Слабый, WeakTrackResurrection, Нормальный или закрепленный. Когда ручка имеет Вы можете использовать его для предотвратить управляемый объект от собранные сборщиком мусора когда неуправляемый клиент держит только ссылка. Без такой ручки, объект может быть собран сборщик мусора перед завершением его работа от имени неуправляемого клиент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...