Можно ли использовать ссылку на объект, принадлежащий shared_ptr? - PullRequest
2 голосов
/ 24 марта 2019

Я обнаружил, что это работает хорошо, но я не знаю, безопасно ли это, потому что я не понимаю, почему это работает:

struct X{
  static X& make(){
    return *std::make_shared<X>();
  }
  ...
}

int main(){
   const auto& a = X::make();
   a.function();
   ...
   // seems like the instance holds and nothing broken
}

В моем понимании возвращенная ссылка на разыскиваемый объект изshared_ptr operator* не должно влиять на то, как shared_ptr управляет счетчиком ссылок экземпляра: поэтому созданный экземпляр внутри make() должен быть уничтожен после выполнения make().Но этот код кода работал хорошо много раз, и я не понимаю, почему.Так что я не уверен, сможем ли мы действительно сделать это таким образом ... благодарны за любые комментарии!

1 Ответ

8 голосов
/ 24 марта 2019

Нет, общий указатель, возвращаемый из make_shared, мгновенно уничтожается после возврата, и, таким образом, ссылка, полученная при разыменовании, будет зависать.Это может выглядеть , как будто оно работает, но на самом деле это просто неопределенное поведение, и, как сказано в комментариях, undefined не определено.

...