Используйте только shared_ptr. С auto_ptr вы можете иметь ТОЛЬКО ОДНУ ссылку на свой объект. Также auto_ptr не медленнее, он должен работать быстрее, чем shared_ptr.
Чтобы не задавать такие вопросы, вам нужно знать, как работают эти умные указатели.
auto_ptr просто сохраняет указатель на свой объект и уничтожает его в своем деструкторе.
Проблема auto_ptr заключается в том, что когда вы пытаетесь скопировать его, он останавливается, чтобы указать на ваш объект.
Например
auto_ptr a_ptr (новый SomeClass);
auto_ptr another_ptr = aptr; // после этого another_ptr указывает на ваш класс, но a_ptr больше не указывает на него!
Вот почему я не рекомендую вам использовать auto_ptr.
Общий указатель, подсчитывающий, насколько интеллектуальные указатели указывают на ваш объект и уничтожают ваш объект, когда на него больше нет указателей. Вот почему вы можете иметь более одного указателя, указывающего на ваш объект.
Но общий указатель также не идеален.И если в вашей программе у вас есть циклический граф (когда у вас есть классы A и B, а A имеют член shared_ptr, который указывает на B и B, или объекты-члены B имеют shared_ptr, указывающие на A), чем A и B никогда не будут удалены, и вы будете есть память лизать.
Чтобы написать правильный код с shared_ptr, вам нужно быть осторожным, а также использовать weak_ptr. Для получения дополнительной информации смотрите здесь http://www.boost.org/doc/libs/1_45_0/libs/smart_ptr/smart_ptr.htm
Не выбирайте интеллектуальные указатели, основанные на воспринимаемой эффективности (для одного человека абсолютно ужасно воспринимается эффективность и, как показано, обычно ошибочно). Выберите умный указатель, который показывает, как вы ожидаете, что указатель будет использоваться. Если вы передаете право собственности auto_ptr, это хорошо, если вы создаете неявно общий объект, тогда shared_ptr лучше. –