Вы не должны всегда использовать 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>();