~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, ровно один раз.


<< назад вперед >>