Читаем Программирование полностью

  auto_ptr< vector > p(new vector);  // выделяет свободную

                                               // память

  // ...заполняем вектор данными;

  // возможна генерация исключения...

  return p.release();  // возвращаем указатель,

                       // которым владеет объект p

}

Объект класса auto_ptr просто владеет указателем в функции. Он немедленно инициализируется указателем, созданным с помощью оператора new. Теперь мы можем применять к объектам класса auto_ptr операторы –> и * как к обычному указателю (например, p–> at(2) или (*p).at(2)), так что объект класса auto_ptr можно считать разновидностью указателя. Однако не спешите копировать класс auto_ptr, не прочитав соответствующей документации; семантика этого класса отличается от семантики любого типа, который мы до сих пор встречали. Функция release() вынуждает объект класса auto_ptr вернуть обычный указатель обратно, так что мы можем вернуть этот указатель, а объект класса auto_ptr не сможет уничтожить объект, на который установлен возвращаемый указатель. Если вам не терпится использовать класс auto_ptr в более интересных ситуациях (например, скопировать его объект), постарайтесь преодолеть соблазн. Класс auto_ptr предназначен для того, чтобы владеть указателем и гарантировать уничтожение объекта при выходе из области видимости. Иное использование этого класса требует незаурядного мастерства. Класс auto_ptr представляет собой очень специализированное средство, обеспечивающее простую и эффективную реализацию таких функций, как make_vec(). В частности, класс auto_ptr позволяет нам повторить наш совет: с подозрением относитесь к явному использованию блоков try; большинство из них вполне можно заменить, используя одно из применений принципа RAII. 

<p id="AutBody_Root368"><strong>19.5.5. Принцип RAII для класса vector</strong></p>

Даже использование интеллектуальных указателей, таких как auto_ptr, может показаться недостаточно безопасным. Как убедиться, что мы выявили все указатели, требующие защиты? Как убедиться, что мы освободили все указатели, которые не должны были уничтожаться в конце области видимости? Рассмотрим функцию reserve() из раздела 19.3.5.

template

void vector::reserve(int newalloc)

{

  if (newalloc<=space) return;     // размер никогда не уменьшается

  T* p = alloc.allocate(newalloc); // выделяем новую память

  for (int i=0; i

                                   // копируем

  for (int i=0; i

  alloc.deallocate(elem,space);    // освобождаем старую память

  elem = p;

  space = newalloc;

}

  Обратите внимание на то, что операция копирования старого элемента alloc.construct(&p[i],elem[i]) может генерировать исключение. Следовательно, указатель p — это пример проблемы, о которой мы предупреждали в разделе 19.5.1. Ой! Можно было бы применить класс auto_ptr. А еще лучше — вернуться назад и понять, что память для вектора — это ресурс; иначе говоря, мы можем определить класс vector_base для выражения фундаментальной концепции, которую используем все время. Эта концепция изображена на следующем рисунке, содержащем три элемента, определяющих использование памяти, предназначенной для вектора:

Добавив для полноты картины распределитель памяти, получим следующий код:

template

struct vector_base {

  A alloc;    // распределитель памяти

  T* elem;    // начало распределения

  int sz;     // количество элементов

  int space;  // размер выделенной памяти

  vector_base(const A& a, int n)

  :alloc(a), elem(a.allocate(n)), sz(n), space(n) { }

  ~vector_base() { alloc.deallocate(elem,space); }

};

Обратите внимание на то, что класс vector_base работает с памятью, а не с типизированными объектами. Нашу реализацию класса vector можно использовать для владения объектом, имеющим желаемый тип элемента. По существу, класс vector — это просто удобный интерфейс для класса vector_base.

template >

class vector:private vector_base {

public:

  // ...

};

Теперь можно переписать функцию reserve(), сделав ее более простой и правильной.

template

void vector::reserve(int newalloc)

{

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных