2014-02-14 3 views
4

Я пытаюсь понять некоторые подробности о том, как работает класс 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(); 

Спасибо за любую помощь по этому вопросу.

+1

Единственное, что нужно знать о 'auto_ptr' - это сломано и не должно использоваться. –

+0

@CaptainObvlious отлично подходит для некоторых ситуаций. Если у вас есть C++ 11, нет причин использовать его. Но в C++ 03 иногда нет хорошей альтернативы. Во всяком случае, этот вопрос является хорошим и относится к 'unique_ptr' тоже. – juanchopanza

+0

Возможно, вам захочется узнать об Идиоме [Copy-Swap] (http://stackoverflow.com/q/3279543/10077). –

ответ

4

Оператор присваивания auto_ptr передает право собственности на объект у правопреемника, эффективно освобождая auto_ptr, от которого объект назначен. Таким образом, семантика оператора присваивания довольно противоречива. Вероятно, это основная причина, по которой auto_ptr устарел и должен быть заменен на unique_ptr.

+0

ОК спасибо. но я все еще хочу понять ... Я думаю, что более фундаментальный вопрос на C++ беспокоит меня. bar1 - тот, который назначен. так что он не знал бы нуля, не так ли? поэтому я предполагаю, что, поскольку fBar1 также является auto_ptr, он должен обнулять bar1 в операторе присваивания fBar1, правильно ли это звучит? Спасибо за ответы на все вопросы. – driftwood

+1

@ пользователь2722568: это правильно. Оператор присваивания, вызываемый в целевом операнде 'fBar1', изменяет свой исходный операнд' bar1'. –

+0

ОК большое спасибо. язык оригинального автора (языка Tbar/TFoo) меня смутил. – driftwood

Смежные вопросы