Есть ли способ убедиться, что std::shared_ptr
является единственной ссылкой на объект во всей программе?
У меня сложилось впечатление, что следующего было бы достаточно даже в многопоточной среде, но из-за того, что std::shared_ptr::unique
устарело, я не уверен (и мое параллельное фу меня подводит):
std::shared_ptr<Foo> bar(std::shared_ptr<Foo>&& src) {
std::shared_ptr<Foo> self = std::move(src);
if(self && self.unique()) {
// self is *the* only reference
}
return std::move(self);
}
(редактировать)
Если я правильно понимаю (см. например, Почему std :: shared_ptr :: unique () устарела? ) атомный подсчет ссылок гарантирует, что self
- это единственный действующий ref для данных внутри блока if
, но модификации через разрушенные ссылки не являются последовательными до вызовом unique()
ивозможно, еще не завершено.
Впредь при изменении *self
внутри блока if
все еще существует потенциальная гонка данных.Это правильно?