2012-04-28 2 views
0

shared_ptr на C++ приходит к решению проблемы, несколько удалений, когда несколько объектов становятся владельцами объекта. Он делает это, делая только последнее удаление.
Существует еще один аромат этого указателя, когда объект хочет владеть, но не хочет задерживать удаление, поэтому он принимает слабый указатель, который уведомляет его о его удалении, чтобы предотвратить проблемы.
Существует еще один способ сделать это. Вместо того, чтобы делать только последнее удаление, сделайте только первое удаление, и остальные объекты должны быть уведомлены о том, что это произошло так же, как и слабый указатель.
Это полезно для объекта, такого как соединение, что если один конец его освобождает, он должен быть уничтожен, а другой конец знает об этом.
Есть ли что-нибудь подобное в C++ или Boost?Разный вид долевого владения

+0

Не можете ли вы реализовать простую оболочку указателя, которая проверяет, указывает ли она на адрес NULL памяти перед ее использованием? Таким образом, если какой-либо объект уничтожает указатель, т. Е. Указывает на местоположение NULL, все остальные объекты будут знать, что указатель уже удален. –

+0

В то время как smart-ptr для обернутого ptr решает эту проблему для однопоточного футляра, поточно-безопасное решение довольно сложное ... BTW: Ответ на вопрос - нет. –

+0

Вы можете выдать сигнал из деструктора объекта. См. Boost.Signals – rmflow

ответ

0

Этот шаблон может быть смоделирован с использованием единого общего, мьютексированного shared_ptr, используемого только для создания и уничтожения объекта, и weak_ptr для каждого клиента/конечной точки, используемого для доступа.

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

Более традиционным решением будет передача сообщения об отключении по каналу.

0

Есть несколько типов уведомлений:

  • синхронное
  • асинхронных
  • по требованию (на самом деле не уведомление)

В зависимости от того, что вы действительно хотите, то реализация может сильно различаться.

Последний (по требованию) уже доступен через типичный shared_ptr/weak_ptr дихотомии: при обращении к объекту через weak_ptr, вы будете знать, если он был удален тем.

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

Смежные вопросы