Я пытаюсь понять некоторые подробности о том, как работает класс auto_ptr. Предположим, у вас есть следующий класс (я нашел это на веб-сайте, где человек объясняет тонкости оператора присваивания).Попытка понять auto_ptr
class TFoo : public TSuperFoo {
auto_ptr<TBar> fBar1;
auto_ptr<TBar> fBar2;
public:
TFoo& TFoo::operator=(const TFoo& that);
// various other method definitions go here...
}
Теперь реализация оператора присваивания.
TFoo& TFoo::operator=(const TFoo& that)
{
if (this != &that) {
auto_ptr<TBar> bar1 = new TBar(*that.fBar1);
auto_ptr<TBar> bar2 = new TBar(*that.fBar2);
fBar1 = bar1;
fBar2 = bar2;
}
return *this;
}
Он продолжает говорить
Здесь, если вторая новая операция терпит неудачу, первый новый TBAR будет удален деструктора auto_ptr, когда мы выходим из функции. Но если оба новых успеха преуспеют, назначения будут удалять объекты fBar1 и fBar2, которые ранее указывались, и также будут обнулять строки bar1 и bar2, чтобы их деструкторы ничего не удаляли при выходе из этой функции.
Итак, мой вопрос: почему bar1 и bar2 будут обнулены? Что вызовет это? Вам не нужно делать что-то вроде
fBar = bar1.release();
Спасибо за любую помощь по этому вопросу.
Единственное, что нужно знать о 'auto_ptr' - это сломано и не должно использоваться. –
@CaptainObvlious отлично подходит для некоторых ситуаций. Если у вас есть C++ 11, нет причин использовать его. Но в C++ 03 иногда нет хорошей альтернативы. Во всяком случае, этот вопрос является хорошим и относится к 'unique_ptr' тоже. – juanchopanza
Возможно, вам захочется узнать об Идиоме [Copy-Swap] (http://stackoverflow.com/q/3279543/10077). –