~auto_ptr(){delete the_p;}
В нашей программе деструктор вызывается как для а, так и для Ь, поэтому выполняются оба действия
delete a.the_p; delete b.the_p;
что может показаться ошибкой. Однако один из двух используемых здесь указателей равен NULL, а применение оператора delete к указателю, равному NULL, является разрешенной операцией, которая не вызывает никаких действий.
Следует упомянуть об унарном операторе *, который возвращает *the_p. Поскольку функция-член get возвращает указатель the_p, мы упростим использованную нами запись. Например, вместо
*a.get() = 123;
напишем
*а = 123; но должны иметь в виду, что а не является настоящим указателем.
Предупреждение
В отличие от прочих составляющих библиотеки STL класс autojptr иногда критикуют за странное поведение, поэтому используйте его только тогда, когда точно знаете, что вы делаете. Например, после выполнения
auto_ptr<int> a(new int), b; *a.get() = 123; b = a;
может показаться странным, что, хотя значение *Ь определено и равно 123, мы не имеем права использовать выражение *а, поскольку последнее присваивание приводит к обнулению указателя на целое, содержащегося в а. Причина этого заключена в необходимости освобождать память, выделенную с помощью оператора new, ровно один раз.