Есть ли повышение:: weak_intrusive_pointer?

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

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

Кто-либо знает об ориентированной на многопотоковое исполнение реализации слабого навязчивого указателя?

Богатое спасибо

14
задан Peter Alexander 8 March 2010 в 14:22
поделиться

2 ответа

В этом нет никакого смысла.

Чтобы уточнить: 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;)

11
ответ дан 1 December 2019 в 13:08
поделиться

Текущая реализация навязчивого указателя использует счетчик ссылок. Таким образом, удаление объекта delete также удаляет счетчик, поэтому weak_intrusive_pointer никогда не узнает, что объект был удален.

Если вам нужно получить weak_ptr из этого , вы, вероятно, выполните поиск по boost :: enable_shared_from_this .

4
ответ дан 1 December 2019 в 13:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: