Используется объектом для декларации возможности подсчитывать ссылки.
При использовании объектов, подсчитывающих ссылки (наследующих данный интерфейс), следует учитывать следующее. Все управление подсчетом ссылок осуществляется через ссылочные указатели - RefPtr при их инициализации, присвоении, уничтожении (см. класс RefPtr). Все обращения к объекту, подсчитывающему ссылки, должны производится через ссылочные указатели. Пока выполняется метод объекта, должен иметься ссылочный указатель на этот объект (это требование следует учитывать при разработке многопоточных систем или систем с обратными вызовами).
При создании объекта его счетчик ссылок устанавливается в 0. При инициализации ссылочного указателя ссылкой на объект или другим ссылочным указателем производится увеличение кол-ва ссылок на объект. При потере ссылки при разрушении ссылочного указателя или присвоении ему нового значения счетчик ссылок на старый объект уменьшается.
При достижении счетчиком ссылок 0 объект переводится в т.н. удаляемое состояние, в котором он может находиться до своего физического удаления. Если наряду с сылочными указателями используются и обычные указатели, то при присвоении ссылочному указателю обычного указателя на объект, который находится в удаляемом состоянии, ссылочный указатель принудительно будет установлен в NULL (все это не относится к случаю, когда ссылочному указателю присваивается значение другого ссылочного указателя, т.к. объект по определению не может находится в удаляемом состоянии при наличии хотя бы одного ссылочного указателя). Поэтому перед использованием ссылочного указателя после присвоения ему обычного указателя его следует проверять на NULL. Из этого правила существуют 2 очевидных исключения:
Создавать объекты с подсчетом ссылок рекомендуется в динамической памяти. В статической памяти или в стеке тоже возможно, однако при этом нельзя использовать ссылочные указатели, т.к. это приведет к вызову опертора delete не в динамической памяти.
Внимание! Когда объект создается в динамической памяти, необходимо присвоить результат оператора new какому-либо указателю (с использованием конструктора, принимающего обычный указатель, или операции NewPointer), даже если объект не будет использоваться. В противном случае объект никогда не будет удален автоматически.
Наследующие классы не могут сами реализовывать данный интерфейс. Для реализации они должны наследовать RefBase, RefBaseEx или AggregatedBase.
Для удобства использования наследующие данный интерфейс классы должны объявлять вложенный тип Ptr как ссылочный указатель на этот класс:
class MyClass : public Cntm::RefBase { public: typedef Cntm::RefPtr<MyClass> Ptr; ..... }; .... MyClass::Ptr p1 = new MyClass;
Реализации интерфейса поддерживают многопоточность.
См. определение в файле IRefObject.h строка 60
Открытые типы | |
typedef RefPtr < IRefObject > | Ptr |
Друзья | |
class | RefBase |
class | AggregatedBase |
class | SpecUtils::RefObjectPtrProxy |
class | SpecUtils::RefObjectPtrPtrProxy |
typedef RefPtr< IRefObject > Cntm::IRefObject::Ptr |
Переопределяется в Cntm::ActiveObject, Cntm::NoRefPtrRegisterEx< T >, Cntm::RegisterEx< ValueT, StoreT >, Cntm::ExtraSynchroSpace, Cntm::IBasicSynchro, Cntm::MainSynchroSpace, Cntm::QTMainSynchroSpace, Cntm::SynchroObject, Cntm::SynchroSpace и Cntm::RegisterEx< Cntm::RefPtr< T >, SpecUtils::NoRefPtrStorage< T > >.
См. определение в файле IRefObject.h строка 64
friend class RefBase [friend] |
См. определение в файле IRefObject.h строка 68
friend class AggregatedBase [friend] |
См. определение в файле IRefObject.h строка 69
friend class SpecUtils::RefObjectPtrProxy [friend] |
См. определение в файле IRefObject.h строка 70
friend class SpecUtils::RefObjectPtrPtrProxy [friend] |
См. определение в файле IRefObject.h строка 71
© Овсеевич Р.В. Документация по CntmLib 1.1.4 от 28 May 2008. Создано системой 1.5.3 |