По причинам прежней версии я должен использовать навязчивые указатели, поскольку мне нужна способность преобразовать необработанные указатели на интеллектуальные указатели.
Однако я заметил, что нет никакого слабого навязчивого указателя для повышения. Я действительно находил разговор об этом в списке потока повышения, однако ничто конкретное.
Кто-либо знает об ориентированной на многопотоковое исполнение реализации слабого навязчивого указателя?
Богатое спасибо
В этом нет никакого смысла.
Чтобы уточнить: weak_ptr
указывает на тот же экземпляр объекта counter
, что и shared_ptr
. Когда shared_ptr
выходит из области видимости, экземпляр счетчика
остается (с эффективным счетчиком 0), что позволяет экземплярам weak_ptr
проверять, что они эффективно указать на освобожденный объект.
При навязчивом подсчете счетчик интегрирован в объект. Когда счетчик достигает 0, объект обычно либо перерабатывается, либо удаляется ... но дело в том, что счетчик больше не доступен. Обоснование состоит в том, что это обеспечивает более эффективное хранилище (1 фрагмент) и большую скорость (расположение кеша).
Если вам нужен подсчет слабых ссылок и вы не заботитесь о преимуществах навязчивого подсчета, вы можете использовать комбинацию shared_ptr
и weak_ptr
.
Идея состоит в том, чтобы отсоединить счетчик от объектов.
class Counted
{
// bla
private:
boost::shared_ptr<int> mCounter;
};
Теперь вы можете возвращать слабые дескрипторы:
class WeakHandle
{
public:
explicit WeakHandle(Counted& c): mCounter(c.mCounter), mObject(&c) {}
bool expired() const { return mCounter.expired(); }
private:
boost::weak_ptr<int> mCounter;
Counted* mObject;
};
Здесь мы деассоциируем время жизни счетчика со временем жизни объекта, чтобы он пережил разрушение объекта ... частично. Таким образом, становится возможным использование weak_ptr
.
И, конечно же, с помощью shared_ptr
и weak_ptr
это Thread Safe;)
Текущая реализация навязчивого указателя использует счетчик ссылок. Таким образом, удаление объекта delete также удаляет счетчик, поэтому weak_intrusive_pointer никогда не узнает, что объект был удален.
Если вам нужно получить weak_ptr из этого
, вы, вероятно, выполните поиск по boost :: enable_shared_from_this
.