Поиск weak_ptrs, ссылающихся на shared_ptr

Есть ли способ узнать количество слабых_ptr, на которые ссылается shared_ptr?

unique()/use_count() можно использовать для поиска shared_ptrs, но существует ли аналогичная конструкция для поиска ссылающихся слабых_ptrs.

Я хочу освободить ресурс, удерживаемый shared_ptr, только если на него не ссылаются weak_ptr. Так что когда-нибудь в будущем, если я попытаюсь создать shared_ptr из этого weak_ptr, я не должен получить nullptr.

Возможно ли это в настоящее время в С++ 11?


person Arun    schedule 24.12.2014    source источник
comment
Если вам нужно это сделать, я бы пересмотрел ваш дизайн   -  person Ed Heal    schedule 24.12.2014
comment
Я хочу освободить ресурс, удерживаемый shared_ptr, только если на него не ссылаются weak_ptr. Тогда почему бы не использовать shared_ptr везде?   -  person John Zwinck    schedule 24.12.2014
comment
Технически он на неправильном пути, но вопрос справедлив, в чем причины минусов?!   -  person Drax    schedule 24.12.2014


Ответы (1)


No.

Для этого нет интерфейса, потому что это упустит весь смысл.

Ресурс освобождается, если на него не ссылается std::shared_ptr.

Используя std::weak_ptr, вы специально разрешаете освобождение вашего ресурса. Не используйте его, если это не то, что вы хотите.

person milleniumbug    schedule 24.12.2014
comment
Ресурс удаляется при уничтожении последнего shared_ptr, но в некоторых случаях он может не освобождаться. Например, если ресурс был выделен с помощью std::make_shared, некоторые реализации могут сгруппировать блок управления и память для выделенного объекта. В этом случае, если у вас есть weak_ptrs, память все равно будет утекать, даже если ресурс будет логически уничтожен. Таким образом, даже если мотивация неверна, необходимость знать, сколько слабых_ptr вокруг, является законной и может быть полезна для целей отладки. - person gigabytes; 24.12.2014
comment
@gigabytes Хотя это правда, это деталь реализации, и она не очень важна для программы, использующей std::weak_ptr. Требование, чтобы интерфейс знал о счете, раскрыл бы слишком много деталей реализации и ограничил бы другие допустимые реализации. ИМХО, это не очень полезно для отладки, поскольку в упомянутой вами ситуации я бы предпочел иметь список слабых указателей, указывающих на один и тот же блок управления. Счетчик только говорит вам, сколько других вы должны найти. Если вы хотите запросить детали реализации, используйте инструменты, которые предоставляет вам реализация (например, отладчик). - person milleniumbug; 24.12.2014
comment
Это не детали реализации, поскольку стандарт допускает такую ​​оптимизацию, и это как раз основная мотивация std::make_shared. В любом случае, я не утверждаю, что стандарт должен обеспечивать способ запроса количества еще живых weak_ptr. - person gigabytes; 24.12.2014