С++ для начинающих




Шаблон auto_ptr * - часть 3


Аналогично ведет себя и операция присваивания. Пусть у нас есть два объекта auto_ptr:

auto_ptr< int > p1( new int( 1024 ) );

auto_ptr< int > p2( new int( 2048 ) );

Мы можем скопировать один объекта auto_ptr в другой с помощью этой операции:

p1 = p2;

Перед присваиванием объект, на который ссылался p1, удаляется.

После присваивания p1 владеет объектом типа int со значением 2048. p2 больше не может использоваться как ссылка на этот объект.

Третья форма определения объекта auto_ptr создает его, но не инициализирует значением указателя на область памяти из хипа. Например:

// пока не ссылается ни на какой объект

auto_ptr< int > p_auto_int;

Поскольку p_auto_int не инициализирован адресом какого-либо объекта, значение хранящегося внутри него указателя равно 0. Разыменование таких указателей приводит к непредсказуемому поведению программы:

// ошибка: разыменование нулевого указателя

if ( *p_auto_int != 1024 )

    *p_auto_int = 1024;

Обычный указатель можно проверить на равенство 0:

int *pi = 0;

if ( pi ! = 0 ) ...;

А как проверить, адресует auto_ptr какой-либо объект или нет? Операция get() возвращает внутренний указатель, использующийся в объекте auto_ptr. Значит, мы должны применить следующую проверку:

// проверяем, указывает ли p_auto_int на объект

if ( p_auto_int.get() != 0 &&

    *p_auto_int != 1024 )

      *p_auto_int = 1024;

Если auto_ptr ни на что не указывает, то как заставить его адресовать что-либо? Другими словами, как мы можем присвоить значение внутреннему указателю объекта auto_ptr? Это делается с помощью операции reset(). Например:

else

   // хорошо, присвоим ему значение

   p_auto_int.reset( new int( 1024 ) );

Объекту auto_ptr нельзя присвоить адрес объекта, созданного с помощью оператора new:

void example() {

    // инициализируется нулем по умолчанию

    auto_ptr< int > pi;

    {

        // не поддерживается

        pi = new int( 5 ) ;

    }

}

В этом случае надо использовать функцию reset(), которой можно передать указатель или 0, если мы хотим обнулить объект auto_ptr. Если auto_ptr указывает на объект и является его владельцем, то этот объект уничтожается перед присваиванием нового значения внутреннему указателю auto_ptr. Например:




Содержание  Назад  Вперед