Должен ли я прекратить использование auto_ptr?
Недавно я начал оценивать std::auto_ptr
, и теперь я прочитал, что это будет deprecated. Я начал использовать его для двух ситуаций:
- Возвращаемое значение factory
- Передача прав на передачу информации
Примеры:
// Exception safe and makes it clear that the caller has ownership.
std::auto_ptr<Component> ComponentFactory::Create() { ... }
// The receiving method/function takes ownership of the pointer. Zero ambiguity.
void setValue(std::auto_ptr<Value> inValue);
Несмотря на проблематичную семантику копирования, я нахожу auto_ptr
полезным. И, похоже, альтернативы для приведенных выше примеров не существует.
Должен ли я продолжать использовать его, а затем переключаться на std::unique_ptr
? Или его следует избегать?
Ответы
Ответ 1
Это очень полезно, несмотря на недостатки, что я настоятельно рекомендую просто продолжать использовать его и переключиться на unique_ptr
, когда он станет доступен.
::std::unique_ptr
требуется компилятор, который поддерживает ссылки rvalue, которые являются частью стандартного проекта С++ 0x, и для этого потребуется очень широкая поддержка. И пока доступны ссылки rvalue, ::std::auto_ptr
- лучшее, что вы можете сделать.
Наличие в коде кода ::std::auto_ptr
и ::std::unique_ptr
может смутить некоторых людей. Но вы должны иметь возможность искать и заменять ::std::unique_ptr
, когда вы решите изменить его. Если вы это сделаете, вы можете получить ошибки компилятора, но их легко устранить. Более высокий ответ на этот вопрос о замене ::std::auto_ptr
на ::std::unique_tr
имеет более подробную информацию.
Ответ 2
устаревшее не означает, что он уходит, просто будет лучшая альтернатива.
Я бы посоветовал использовать его в текущем коде, но используя новую альтернативу для нового кода (новые программы или модули, а не небольшие изменения в текущем коде). Консистенция важна
Ответ 3
Я предлагаю вам использовать интеллектуальные указатели boost.