Использование умных указателей в C++

Этот пост - перевод статьи Герба Саттера: GotW #89 Solution: Smart Pointers.

Постановка проблемы

Простой вопрос

1. В каких случаях следует использовать shared_ptr а в каких - unique_ptr? Приведите как можно больше соображенией на эту тему.

Вопросы посложнее

2. Почему практически всегда следует использовать make_shared для создания объекта, которым будут впоследствии владеть shared_ptr? Объясните.

3. Почему практически всегда следует использовать make_unique для создания объекта, которым будет владеть unique_ptr? Объясните.

4. Что такое auto_ptr?