Интеллектуальный указатель с подсчетом ссылок, который удаляет принадлежащий объект с числом ссылок больше нуля? - PullRequest
1 голос
/ 08 ноября 2010

У меня есть дизайн, где объекты одновременно принадлежат 2 очередям. Иногда сами очереди могут быть удалены. В этом случае все объекты в очереди должны быть удалены и удалены из другой очереди, в которой они находятся.

В текущем решении есть собственные объекты, которые знают о двух очередях, но это приводит к ужасной связи.

Есть ли класс умных указателей, который может мне помочь? Конструкция будет либо с «новым», либо с копией существующего указателя. Уничтожение приведет к удалению принадлежащего ресурса. Доступ был бы как слабый_птр, давая возможность указывать на ноль.

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

Кто-нибудь знает что-нибудь подобное?

Спасибо, Тони

Ответы [ 2 ]

1 голос
/ 08 ноября 2010

Требуется, чтобы удаление объекта из очереди удаляло его из другой очереди, не связывая его с очередью.

Один из подходов, который позволил бы избежать этой связи, состоял бы в отметке объектакак удалено, фактически не удаляя его.

  • Использование объектов-оболочек в качестве элементов очередей.Логически помещенный в очередь объект имеет два объекта-оболочки, по одному для каждой очереди.
  • Каждая оболочка содержит boost :: shared_ptr для объекта, логически являющегося членом каждой очереди.
  • Деструктор оболочки помечает логически поставленный в очередь объект как мертвый.
  • При извлечении предметов из очереди игнорируйте те, которые отмечены как мертвые.
0 голосов
/ 08 ноября 2010

Вообще говоря, нет никаких многоразовых решений для подсчета ссылок при наличии циклов ссылок.Существуют решения, но они либо специфичны для разрешенного шаблона эталонных циклов, либо для сборщиков мусора.Исходя из того, как вы описали проблему, вы должны иметь возможность выяснить, какие объекты принадлежат данной очереди (чтобы вы могли удалить очередь), и какие очереди владеют данным объектом (чтобы вы могли удалить объект из всех очередей).Таким образом, у вас есть справочные циклы.

Чтобы решить проблему некрасивой связи, я бы предложил иметь очереди, содержащие прокси-объекты, каждый из которых владеет реальным объектом и знает, какие очереди владеют им.Методы очереди будут использовать и обновлять эти прокси-объекты.

...