int sz; int managed; public:
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; } } };
Содержание Назад Вперед