Умные указатели

Указатель с подсчётом ссылок

Указатель с подсчётом ссылок omni::smart::SharedPtr позволяет автоматически удалять объект, когда на него больше нет ссылок. Указатель является шаблонным классом. Параметр шаблона может быть классом, производным от omni::smart::SharedObj, который подсчитывает количество ссылок на себя.

  class MyClass: public omni::smart::SharedObj {
    // ...
  };

  // shared pointer to MyClass
  typedef omni::smart::SharedPtr<MyClass> PMyClass;

  void f()
  {
    PMyClass p(new MyClass());
    p = new MyClass();

    *p; // access to MyClass

    // ...
  }

Поддерживаются два типа указателей с подсчетом ссылок: "тонкий" и "толстый". "Тонкий" указатель использует счетчик ссылок в самом объекте типа T. Для это тип T должен быть производным от omni::smart::SharedObj.

SharedPtr1.png

Тонкий указатель с подсчетом ссылок

"Толстый" указатель для каждого объекта типа T создает свой счетчик в свободной памяти. В этом случае сам указатель является потенциально более медленным и большим, но и более универсальным. Т.к. может использоваться с типами не производными от omni::smart::SharedObj.

SharedPtr2.png

Толстый указатель с подсчетом ссылок

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

Умные указатели не являются панацеей и их следует использовать ОЧЕНЬ осторожно. Они перестают работать в случае возникновения циклических зависимостей. Т.е. если объект A содержит умный указатель, который ссылается на объект B, который в свою очередь содержит умный указатель на тот же объект A, то эти два объекта автоматически никогда не удалятся. В цикле может участвовать два или более объектов. Поэтому при проектировании программы нужно осмысленно использовать автоматические указатели и разделять сильные и слабые зависимости.

Использовать omni::smart::SharedPtr рекомендуется только там где, время жизни объекта может заканчиваться в разных местах программы в неопределённом порядке. Там же, где время жизни объекта чётко определено, можно использвать std::auto_ptr или простые указатели.

Ещё один важный момент: если планируется использовать автоматические указатели, то объекты могут создаваться только в свободной памяти с помощью оператора new.


Generated on Wed Jun 6 17:27:47 2007 for OMNI by  doxygen 1.5.2