Язык программирования C++ для профессионалов



         

Контейнеры и удаление - часть 3


template<class T> PVector { T** p; int sz; int managed; public: PVector(int s, int managed = 0 ); ~PVector(); // ... };

template<class T> PVector<T>::PVector(int s, int m) { // проверка s p = new T*[sz=s]; if (managed = m) for (int i = 0; i<s; i++) p[i] = 0; }

template<class T> PVector<T>::~PVector() { if (managed) { for (int i = 0; i<s; i++) delete p[i]; } delete p; }

Примером класса, который может предложить библиотека для облегчения управления памятью, является управляющий класс из §13.9. Раз в управляющем классе ведется подсчет ссылок на него, можно спокойно передавать объект этого класса, не думая о том, кто будет удалять доступные через него объекты. Это сделает сам объект управляющего класса. Но такой подход требует, чтобы в управляемых объектах было поле для подсчета числа использований. Введя дополнительный объект, можно просто снять это жесткое требование:

template<class T> class Handle { T* rep; int* pcount; public: T* operator->() { return rep; }

Handle(const T* pp) : rep(pp), pcount(new int) { (*pcount) = 0; } Handle(const Handle& r) : rep(r.rep), pcount(r.count) { (*pcount)++; }

void bind(const Handle& r) { if (rep == r.rep) return; if (--(*pcount) == 0) { delete rep; delete pcount; } rep = r.rep; pcount = r.pcount; (*pcount)++; }

Handle& operator=(const Handle& r) { bind(r); return *this; }

~Handle() { if (--(*pcount) == 0) { delete rep; delete pcount; } } };




Содержание  Назад  Вперед