Они предназначены для 2 совершенно разных вариантов использования.
std::unique_ptr
сохраняет единственной собственности объекта и уничтожает этот объект, когда unique_ptr выходит из области видимости. Нет двух экземпляров unique_ptr
, которые могут управлять одним и тем же объектом. (http://en.cppreference.com/w/cpp/memory/unique_ptr)
std::shared_ptr
сохраняет разделяет собственность объекта. Несколько объектов shared_ptr
могут иметь один и тот же объект. Объект уничтожается, и его память освобождается, когда последний оставшийся shared_ptr
, владеющий объектом, уничтожается или последнему оставшемуся shared_ptr
, которому принадлежит объект, присваивается другой указатель через operator=
или reset()
. (http://en.cppreference.com/w/cpp/memory/shared_ptr)
Чтобы обеспечить соблюдение единоличного владения std::unique_ptr
не является назначаемым и не копируемым. Это означает, что вам нужно использовать семантику переноса.
Если вы видите unique_ptr
где-то в коде, это значит, что Посмотрите, вот указатель, и у нас есть это!. Этого нельзя сказать о shared_ptr
, где собственность может быть разбросана по всему коду.
Пробовали ли вы Google на всех? –