Можно создать weak_ptr для установки элементов - PullRequest
0 голосов
/ 15 января 2019

У меня есть std :: multiset объектов (созданный на месте с помощью set :: emplace). Это дает мне отсортированный доступ с помощью пользовательского компаратора.

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

Есть ли способ использовать weak_ptr для указания на объекты в наборе, не используя shared_ptrs в самом наборе? Или единственный способ добиться этого - использовать набор share_ptrs вместо Objects?

Ответы [ 2 ]

0 голосов
/ 15 января 2019

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

0 голосов
/ 15 января 2019

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

Возможно, можно создать слабый указатель, который не полагается на std::shared_ptr, но это не будет std::weak_ptr. Слабый указатель и контейнер должны будут взаимодействовать на очень глубоком уровне - вы также замените std::multiset.

Я считаю, что у вас может быть более серьезная проблема, однако ... если вы удаляете вещи из std::multiset, это может сделать недействительными указатели на все элементы, а не только на удаленные. Хранение std::shared_ptr внутри вашего устройства решит обе эти проблемы одновременно.

На самом деле вычеркнутый раздел не относится к ассоциативным контейнерам, включая std::multiset. Другие типы контейнеров не будут безопасными. Multiset, однако, гарантирует, что

erase члены должны сделать недействительными только итераторы и ссылки на стертые элементы

...