Если у меня есть std::shared_ptr<Foo>
с пользовательским делетером, гарантировано ли, что все связанные слабые указатели видны как истекли от делетера? (Я был бы очень признателен, если бы вы могли привести соответствующие разделы в стандарте.)Являются ли слабые указатели истекли к тому моменту, когда запускается std :: shared_ptr deleter?
Другими словами, утверждение ниже гарантировано не для того, чтобы стрелять?
std::weak_ptr<Foo> weak;
std::shared_ptr<Foo> strong{
new Foo,
[&weak] (Foo* f) {
assert(weak.expired());
delete f;
},
};
weak = strong;
strong.reset();
Ну, счетчик использования будет равен нулю до того, как будет вызван деаэтер, и [эта ссылка 'expired'] (http://en.cppreference.com/w/cpp/memory/weak_ptr/expired) говорит, что это" Эквивалент 'use_count() == 0'". Ссылка не является авторитетной, вам нужно пройти спецификацию, чтобы найти окончательный ответ (проекты стандартов C++ 11, C++ 14 и C++ 17 доступны бесплатно, последний проект до ратификации является хорошим достаточно). –
Согласовано. Но окончательный ответ от стандарта - это именно то, о чем я прошу. :-) Я еще не нашел его для себя. – jacobsa
Я думаю, что это подразумевается: если ваше утверждение неверно, вы можете заменить его на 'weak.lock()' (и, возможно, переместить право собственности), а затем деструктор для общего объекта будет работать дважды. –