Материалы книги получены с http://www.itlibitum.ru/
Базовый класс с подсчетом ссылок
Начнем с абстрактного базового класса, от которого можно создать производный класс с подсчетом ссылок. Базовый класс содержит переменную, в которой хранится количество вызовов функции Grab() за вычетом количества вызовов функции Release().
class RefCount {
private:
unsigned long count; // Счетчик ссылок
public:
RefCount() : count(0) {}
RefCount(const RefCount&) : count(0) {}
RefCount& operator=(const RefCount&)
{ return *this; } // Не изменяет счетчик
virtual ~RefCount() {} // Заготовка
void Grab() { count++; }
void Release()
{
if (count > 0) count --;
if (count == 0) delete this;
}
};
Пока клиентский код правильно вызывает функции Grab() и Release(), все работает абсолютно надежно. Каждый раз, когда клиент получает или копирует адрес объекта, производного от RefCount, он вызывает Grab(). Когда клиент гарантирует, что адрес больше не используется, он вызывает Release(). Если счетчик падает до 0 - бац! Нет больше объекта! Недостаток такой методики очевиден - она слишком полагается на соблюдение всех правил программистом. Можно сделать получше.
Назад Содержание Далее
|