Почему нельзя использовать intrusive_ptr и shared_ptr с контейнерами boost :: intrusive?

Boost :: intrusive документация описывает, как Вы можете использовать умные указатели с навязчивыми контейнерами но затем говорит, что вы не можете использовать умные указатели, которые вы, скорее всего, будете использовать: «Он должен иметь ту же семантику владения, что и необработанный указатель. Это означает, что умные указатели управления ресурсами (такие как boost :: shared_ptr) не могут использоваться.»

Почему это? Я не могу придумать ни одной очевидной причины, по которой они должны быть запрещены. Что именно сломалось бы? Навязчивые контейнеры в любом случае не управляют размещением предметов внутри них. В моем случае я хотел бы использовать intrusive_ptr, но я не вижу причин, по которым shared_ptr также не должен работать.

Редактировать: Для ясности я имею в виду, что указатель хука (например, следующий указатель в навязчивом односвязном списке) должен быть умным указателем.

5

Решение

Возможно, есть ключ в документация для boost::intrusive::slist где говорится, что с конфигурацией по умолчанию, slist хранится в виде кругового списка, что исключает использование shared_ptr/intrusive_ptr и друзья, потому что у вас будет справочный цикл.

Это все еще раздражает, что одна часть повышения не работает должным образом с другой; Я думаю, что единственный обходной путь будет использовать что-то вроде intrusive_ptr и вручную увеличивать счетчик ссылок при добавлении объекта в контейнер и уменьшать его при удалении. (Это исключает shared_ptrпотому что вы не можете настроить его счетчик ссылок напрямую.)

2

Другие решения

Одна очевидная причина — эффективность. shared_ptr использует атомарные операции увеличения / уменьшения для подсчета ссылок. Это означает, что выбрасывать достаточно большой контейнер, который использует shared_ptr указатели под капотом займут секунды, потому что каждый счетчик ссылок должен быть уменьшен атомарно.

0

Предположительно, это потому, что навязчивые контейнеры уже управляют памятью внутренне (например, theboost ptr_ контейнеры), и вместо того, чтобы создавать две разные реализации контейнеров-интрузивов (одну для не принадлежащих указателей и одну для владения), они решили наложить ограничение на то, какие типы точек можно использовать.

0
По вопросам рекламы [email protected]