Должен ли я всегда использовать shared_ptr для создания экземпляра класса (вместо просто нового)? - PullRequest
0 голосов
/ 25 мая 2019

Как показывает вики, shared_ptr может справиться с проблемами перезапуска пространства кучи.Итак, я всегда использую shared_ptr для создания экземпляра, есть ли проблемы?

, и я использую это так, мне не нужно delete s, верно?

s = std::shared_ptr<S>(new S).get();

1 Ответ

3 голосов
/ 25 мая 2019

Вы не должны всегда использовать shared_ptr, потому что есть больше типов интеллектуальных указателей , чем просто shared_ptr.Стандартная библиотека также предоставляет unique_ptr например.Вы должны оценить, что лучше подходит для поставленной задачи.

Однако интеллектуальные указатели в целом являются предпочтительным способом безопасной обработки динамически размещаемых объектов в современном C ++.Как общее практическое правило, избегайте использования new и delete, если только вы не столкнетесь с проблемой, которая не может быть решена без них.

Как пример, ваш пример не будет работать так, как вы ожидаете.

auto s = std::shared_ptr(new S).get();

Это создаст висячий указатель.Вызов new динамически распределяет объект типа S.Указатель на него дается конструктору для shared_ptr, который теперь управляет временем жизни объекта.Затем вы присваиваете копию необработанного указателя с S на s через get().В конце строки деструктор shared_ptr освобождает S, что означает, что все, на что указывает s, не определено.

Правильный способ создания общего указателя:

auto s = std::make_shared<S>();
...