Использовать только 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.
Общий указатель, подсчитывающий количество умных указателей, указывающих на ваш объект, и уничтожающий ваш объект, когда на него больше нет указателей. Вот почему вы можете иметь более 1 указателя, указывающего на ваш объект.
Но общий указатель тоже не идеален. И если в вашей программе есть циклический граф (когда у вас есть классы A, B и A, есть член shared_ptr, который указывает на B и B, или объекты-члены B имеют shared_ptr, указывающий на A), то A и B никогда не будут удалены, и вы иметь память лизнуть.
Чтобы написать правильный код с shared_ptr, вам нужно быть осторожным, а также использовать слабый_птр.
Для получения дополнительной информации смотрите здесь http://www.boost.org/doc/libs/1_45_0/libs/smart_ptr/smart_ptr.htm