c ++ cli — висячий указатель в управляемой оболочке c ++

У меня есть несколько неуправляемых классов C ++, которые ссылаются друг на друга. Чтобы избежать висячих указателей при выпуске экземпляра, я использую интеллектуальные указатели для повышения, в основном shared_ptr. Все идет нормально.

Однако у меня также есть обертка в C ++ / CLI, в которой почти каждый неуправляемый класс имеет свой управляемый эквивалент для предоставления его приложениям .NET. Оболочка довольно проста, однако я был вынужден использовать небезопасный указатель для ссылки на UnmanagedClass * из ManagedClass. Я не могу использовать boost :: shared_ptr в качестве члена ManagedClass, потому что CLR не поддерживает неуправляемые типы в качестве членов класса (только указатели на них).

Пример: класс Car, который содержит 4 экземпляра класса Wheel. Каждый из 5 неуправляемых экземпляров имеет 5 управляемых эквивалентных экземпляров. Неуправляемому автомобилю может потребоваться заменить колеса, он удаляет 4 экземпляра неуправляемого колеса и создает 4 новых. Управляемая машина просит новое неуправляемое колесо для создания 4 новых управляемых экземпляров колеса.

Однако 4 старых управляемых экземпляра Wheel по-прежнему находятся в области действия в управляемом мире и теперь содержат висячий указатель на старые неуправляемые экземпляры. Любые идеи, как понять, что нативный эквивалент обертки был утилизирован? Простая задача с умными указателями. Могу ли я использовать их в управляемом коде?

-1

Решение

Почему бы не использовать внутренний подсчет экземпляров? Создайте базовый нативный класс:

class Base
{
int refCount = 0;

public:
void AddRef() { refCount++; }
void Release() { refCount--; if (refCount == 0) delete this; }
}

Затем используйте его как базовый класс для всех этих и не забудьте вызвать AddRef, когда вы получите экземпляр класса и Release (), когда он вам больше не нужен (например, в деструкторе). Вы должны сделать то же самое в своих классах C ++ / CLI; реализовать интерфейс IDisposable и очистить сохраненные экземпляры собственного класса в методе Dispose (). Использовать его не должно быть много проблем, потому что вам нужно будет вызывать AddRef только один раз внутри конструкторов и Release один раз внутри деструкторов / Dispose.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector