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



         

Инициализация массива, распределенного из хипа * - часть 2


        //      передать ее конструктору;

        // в противном случае вызвать конструктор по умолчанию

        if ( ix < vec_size )

           new( p+offset*ix ) Account( init_values[ix].first,

                                       init_values[ix].second );

        else new( p+offset*ix ) Account;

   }

   // отлично: элементы распределены и инициализированы;

   // вернуть указатель на первый элемент

   return (Account*)p;

}

Необходимо заранее выделить блок памяти, достаточный для хранения запрошенного массива, как массив байт, чтобы избежать применения к каждому элементу конструктора по умолчанию. Это делается в такой инструкции:

char *p = new char[sizeof(Account)*elems];

Далее программа в цикле обходит этот блок, присваивая на каждой итерации переменной p адрес следующего элемента и вызывая либо конструктор с двумя параметрами, если задана пара начальных значений, либо конструктор по умолчанию:

for ( int ix = 0; ix < elems; ++ix )

   {

       if ( ix < vec_size )

           new( p+offset*ix ) Account( init_values[ix].first,

                                       init_values[ix].second );

        else new( p+offset*ix ) Account;

   }

В разделе 14.3 говорилось, что оператор размещения new позволяет применить конструктор класса к уже выделенной области памяти. В данном случае мы используем new для поочередного применения конструктора класса Account к каждому из выделенных элементов массива. Поскольку при создании инициализированного массива мы подменили стандартный механизм выделения памяти, то должны сами позаботиться о ее освобождении. Оператор delete работать не будет:

delete [] ps;

Почему? Потому что ps (мы предполагаем, что эта переменная была инициализирована вызовом init_heap_array()) указывает на блок памяти, полученный не с помощью стандартного оператора new, поэтому число элементов в массиве компилятору неизвестно. Так что всю работу придется сделать самим:

void

Account::

dealloc_heap_array( Account *ps, size_t elems )




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