shared_ptr
на C++ приходит к решению проблемы, несколько удалений, когда несколько объектов становятся владельцами объекта. Он делает это, делая только последнее удаление.
Существует еще один аромат этого указателя, когда объект хочет владеть, но не хочет задерживать удаление, поэтому он принимает слабый указатель, который уведомляет его о его удалении, чтобы предотвратить проблемы.
Существует еще один способ сделать это. Вместо того, чтобы делать только последнее удаление, сделайте только первое удаление, и остальные объекты должны быть уведомлены о том, что это произошло так же, как и слабый указатель.
Это полезно для объекта, такого как соединение, что если один конец его освобождает, он должен быть уничтожен, а другой конец знает об этом.
Есть ли что-нибудь подобное в C++ или Boost?Разный вид долевого владения
ответ
Этот шаблон может быть смоделирован с использованием единого общего, мьютексированного shared_ptr
, используемого только для создания и уничтожения объекта, и weak_ptr
для каждого клиента/конечной точки, используемого для доступа.
Обратите внимание, что такая схема вызовет чрезмерную блокировку и может не дать семантику, которую вы хотите. Вам понадобится lock
weak_ptr
во время использования, который касается внутренних мьютексов shared_ptr
. Когда одна сторона уничтожает экземпляр мастера shared_ptr
, объект сохраняется, пока все операции чтения заканчиваются.
Более традиционным решением будет передача сообщения об отключении по каналу.
Есть несколько типов уведомлений:
- синхронное
- асинхронных
- по требованию (на самом деле не уведомление)
В зависимости от того, что вы действительно хотите, то реализация может сильно различаться.
Последний (по требованию) уже доступен через типичный shared_ptr
/weak_ptr
дихотомии: при обращении к объекту через weak_ptr
, вы будете знать, если он был удален тем.
Остальные два могут быть реализованы с помощью шаблона Observer поверх традиционного shared_ptr
, однако они имеют сложности и последствия для производительности, поэтому я бы удостоверился, что потребность будет реальной, прежде чем использовать их.
- 1. Разный вид дополнительной нагрузки
- 2. Разный вид приложения в android?
- 3. угловой разный вид кнопки с трансляцией
- 4. Разный вид на ландшафт и портрет
- 5. Разный вид флажка на устройстве и эмуляторе
- 6. Разный вид общей ссылки в facebook feed
- 7. Разный вид метаданных ASP.NET: выражение resourcekey
- 8. Разный вид для разных поддоменов в Rails
- 9. Проверки правильности владения моделью
- 10. Java: визуализация владения кодом
- 11. Сделать дубликат долевого всплывающего окна facebook
- 12. Обновите содержание долевого намерения в Android
- 13. Sharethis Share Count Увеличивает без долевого участия
- 14. ClassNotFoundException на открытие иконы facebook долевого андроида
- 15. Laravel 5.2: Разный вид-макет в зависимости от маршрута
- 16. Имея разный вид переключателей в пределах одной группы
- 17. Разный вид моей контактной формы с смартфона и компьютера
- 18. STS: Разный «вид» пакетов весной MVC против Spring Roo - Project
- 19. Разный внешний вид между Firefox и Chrome стиля границы
- 20. RGoogleAnalytics разный вид страницы браузера как разная строка
- 21. Стиль списка, дающий разный вид в разных браузерах
- 22. IOS WebView App - Разный вид на разные размеры scree
- 23. Понимание владения объектами в Java
- 24. Вычисление доли владения акциями компании
- 25. Git - переназначение владения файлами рекурсивно
- 26. Когда используется общий код владения?
- 27. Лучший способ моделирования владения ресурсом
- 28. jQuery условный разный разрешающий
- 29. Разный поиск пучка-продукта
- 30. Разный переход на presentModalViewController: анимированный:
Не можете ли вы реализовать простую оболочку указателя, которая проверяет, указывает ли она на адрес NULL памяти перед ее использованием? Таким образом, если какой-либо объект уничтожает указатель, т. Е. Указывает на местоположение NULL, все остальные объекты будут знать, что указатель уже удален. –
В то время как smart-ptr для обернутого ptr решает эту проблему для однопоточного футляра, поточно-безопасное решение довольно сложное ... BTW: Ответ на вопрос - нет. –
Вы можете выдать сигнал из деструктора объекта. См. Boost.Signals – rmflow