общие, слабые и ленивые указатели в C ++ - PullRequest
13 голосов
/ 03 декабря 2011

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

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

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

Я создал несколько классов, которые не выполняли эту работу некоторое время назад ( см. Статью CVu здесь ), которые использовали shared_ptr и weak_ptr в своей реализации. Основные проблемы с моделью, которую использует USES, и слабые указатели вместо интеграции с ними:

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

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

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

1 Ответ

2 голосов
/ 12 января 2012

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

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 только в течение жизни объекта. И если вы хотите, чтобы вы отличали «еще не построенный» от «разрушенного», вы можете установить bool после запуска фабрики.

...