Интернет магазин китайских планшетных компьютеров



Компьютеры - Идиома copy-and-swap

15 мая 2011


Оглавление:
1. Идиома copy-and-swap
2. Другие операции



это идиома языка программирования C++, позволяющая разрабатывать устойчивые к исключениям операторы присваивания.

Идиома базируется на идиоме Resource Acquisition Is Initialization.

Идиома предполагает реализацию следующих функций-членов класса:

  • конструктора копирования;
  • оператора присваивания;
  • метода swap, не генерирующего исключения и принимающего ссылку на объект класса.

Пример:

class Copyable {
public:
   Copyable& operator= {
      Copyable tmp;
      this->swap;
      return *this;
   }
 
   void swap throw;
};

Устойчивость к исключениям заключается в том, что в операторе присваивания Copyable& operator= нет точки, где генерация исключения могла бы привести к утечке памяти.

Оператор присваивания сначала пытается захватить ресурс «временная копия присваиваемого объекта» и в случае успеха меняет его содержимое с содержимым текущего объекта. Поскольку метод swap объявлен как не генерирующий исключения), единственной точкой, где может возникнуть исключение, является копирование объекта _v. Если копирование не удается, то управление не доходит до метода swap, в противном случае деструктор объекта tmp освобождает ресурсы, прежде принадлежавшие текущему объекту.

Приведённая выше реализация также устойчива к присваиваниям объекта самому себе, однако содержит издержки, связанные с тем, что временная копия в этом случае тоже будет создаваться. Исключить издержки можно дополнительной проверкой:

class Copyable {
public:
   Copyable& operator= {
      if
          Copyable.swap;
      return *this;
   }
 
   void swap throw;
};

Многие контейнеры и алгоритмы стандартной библиотеки C++ и библиотеки STL предполагают наличие устойчивого к исключениям оператора присваивания, но без использования идиомы copy-and-swap иногда довольно сложно реализовать такой оператор присваивания для классов, содержащих, например, указатели на экземпляры других классов.



Просмотров: 1648


<<< Интерпретатор (шаблон проектирования)