общие, слабые и ленивые указатели в C++

Кто-нибудь знает о реализации shared_ptr и weak_ptr вместе с ленивым партнером по инициализации? Требования к классам были:

  • Класс lazy_ptr, который позволяет клиенту создать объект позже (если вообще) без необходимости реализации конструктора.

  • Класс weak_lazy_ptr, который имеет три возможных состояния: еще не построен (не будет привязан к shared_ptr), построен (будет привязан к shared_ptr) и уничтожен (не будет привязан к shared_ptr)

Некоторое время назад я создал несколько классов, которые не полностью выполняли свою работу (см. статью CVu здесь), которые использовали shared_ptr и weak_ptr в своей реализации. Основные проблемы с моделью, которая ИСПОЛЬЗУЕТ общие и слабые указатели вместо интеграции с ними, следующие:

  1. Как только все объекты lazy_ptr выходят из области действия, любые слабые ссылки больше не могут быть заблокированы, даже если другие клиенты владеют версиями shared_ptr.

  2. Построение объектов в разных потоках не может контролироваться

Я был бы признателен за любые указания на другие попытки примирить эти проблемы или на любую незавершенную работу, которая может быть в этой области.


person user1078210    schedule 02.12.2011    source источник
comment
Звучит почти как shared_ptr<boost::optional<T>>, верно?   -  person GManNickG    schedule 03.12.2011
comment
@user1078210 user1078210 Возможно, вы можете найти дополнительную информацию здесь.   -  person ealves    schedule 06.12.2011
comment
@GMan: boost::optional разрешает отложенное построение, но boost::shared_ptr это тоже допускает, так что оба они не нужны, если я вас понимаю.   -  person Drew Dormann    schedule 12.01.2012
comment
@DrewDormann: Не совсем. Разница в том, что при инициализации необязательного объекта все shared_ptr относятся к инициализированному объекту.   -  person GManNickG    schedule 12.01.2012
comment
@GMan: Верно. Я не думал об этом сценарии.   -  person Drew Dormann    schedule 12.01.2012
comment
У меня есть кое-какая работа в этой области в моем личном запасе кода; размещу его где-нибудь под лицензией Boost, если мне удастся его раскопать.   -  person bronekk    schedule 19.01.2012
comment
@bronekk, где я могу посмотреть ваш код?   -  person athos    schedule 02.10.2016


Ответы (1)


Чтобы создать отложенное построение, не требующее параметров:

boost::bind( boost::factory<T*>(), param1, param2 ) создаст функциональный объект, который выполняет эквивалент new T(param1, param2) без необходимости параметров во время построения.

Чтобы создать shared_ptr, поддерживающий эту отложенную конструкцию:

Свяжите свою фабрику со стандартным boost::shared_ptr (например, в созданном вами классе), и вы получите описанные вами результаты, включая соответствующую функциональность weak_ptr...

Любой код, запускающий отложенное построение клиентом, должен выполняться:

your_shared_ptr.reset( your_factory() );

Любой код, запускающий уничтожение объекта, должен выполняться:

your_shared_ptr.reset();

Общий указатель будет оцениваться как true только во время жизни объекта. И если вы хотите отличить «еще не построенное» от «разрушенного», вы можете установить логическое значение после запуска фабрики.

person Drew Dormann    schedule 11.01.2012