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.
Тонкий указатель с подсчетом ссылок
Толстый указатель с подсчетом ссылок
Умные указатели не являются панацеей и их следует использовать ОЧЕНЬ осторожно. Они перестают работать в случае возникновения циклических зависимостей. Т.е. если объект A содержит умный указатель, который ссылается на объект B, который в свою очередь содержит умный указатель на тот же объект A, то эти два объекта автоматически никогда не удалятся. В цикле может участвовать два или более объектов. Поэтому при проектировании программы нужно осмысленно использовать автоматические указатели и разделять сильные и слабые зависимости.
Использовать omni::smart::SharedPtr рекомендуется только там где, время жизни объекта может заканчиваться в разных местах программы в неопределённом порядке. Там же, где время жизни объекта чётко определено, можно использвать std::auto_ptr или простые указатели.
Ещё один важный момент: если планируется использовать автоматические указатели, то объекты могут создаваться только в свободной памяти с помощью оператора new.