У меня есть объект A
, который содержит общий ресурс (shared_ptr) r
, A
является создателем/владельцем r
при построении объекта "регистрирует" его r
с другим объектом B. Объект B содержит ссылку на A
r
в std::set
. Объект A используется как обработчик Boost:: asio::.
Мне нужно отменить r
из B
, когда A
разрушается, а когда A
имеет уникальный доступ к r
, поскольку A
является r
создателем, он несет ответственность за его уничтожение, Примечание: A - копия, созданная несколько раз, когда она используется как boost:: asio handler. Удержание unque acces здесь означает, что операции asio не выполняются (потому что, если они были ссылочным числом, было бы > 2, так как были сделаны копии A
).
В настоящий момент уникальный доступ проверяется r.use_count() == 2
, поскольку A и B имеют доступ к объекту, когда не выполняются асинхронные операции. Тем не менее, я не считаю этот тест логически разумным.
Я думаю, что я должен изменить контейнер B с std::set<boost::shared_ptr<r> >
на std:set<boost::weak_ptr<r> >
, так что r.unique()
логически истинно, если не выполняются асинхронные операции. Является ли это разумным использованием weak_ptr
?
Конструктор и деструктор A
(in_process_invoker) и события регистрации (подключения) и отмена регистрации (disconect) выглядят следующим образом в моем коде:
in_process_invoker(BackEnd & b_in)
: client_data(new ClientData()),
b(b_in),
notification_object(new notification_object_())
{
b.connect(client_data);
}
~in_process_invoker()
{
if(client_data.unique())
{
b.disconect(client_data);
}
}
ИЗМЕНИТЬ
Я изменил свой дизайн на использование необработанных указателей, конструктор по умолчанию помещает invoker в качестве первичного invoker и его копии как не первичные. Когда первичный объект уничтожается, он освобождает память.