Главная » Статьи » IT |
sco способ борьбы с "висячими" указателями
Решение представляет собой два шаблонных класса: Класс ссылка на объект: sco_object<class Type> Класс сам объект: sco_object<class Type> класс объект хранит список указателей на него, а класс-ссылка содержит указатель но объект. Как только объект "умирает" (деструктор), то он зануляет объект-ссылки, которые на него указывают. Когда же "умирает" объект-ссылка, то она производит удаление из списка класса-объекта на который указывает. Пример использования: #include "sco_object.h" int main() { sco_reference<void> ref1; sco_reference<void> ref2; sco_reference<void> ref3; { sco_object<void> ob; ref1.assign_reference(&ob); ref2.assign_reference(&ob); ref3.assign_reference(&ob); } return 0; } Если словами не понятно, то смотреть код и погонять в отладке: #pragma once #include <assert.h> #include <vector> #include <string> //------------------------------------------------------------------------- template<class T> class sco_reference; template<class T> class sco_object; //------------------------------------------------------------------------- template<class T> class sco_reference { friend sco_object<T>; sco_object<T>* m_to; void remove_from_object(); public: sco_reference() : m_to(NULL) {} sco_reference(const sco_reference<T>& a) { *this = a; } sco_reference(sco_object<T>* ob) : m_to(NULL) { assign_reference(ob); } ~sco_reference() { remove_from_object(); } bool has_object() const { return m_to != NULL; } sco_object<T>* operator -> (); sco_reference& operator = (const sco_reference& a) { assign_reference(a.m_to); return *this; } void assign_reference(sco_object<T>* ob); void assign_reference(sco_object<T>& ob); }; //------------------------------------------------------------------------- template<class T> class sco_object { friend sco_reference<T>; std::vector< sco_reference<T>* > m_references; public: sco_object() { } ~sco_object() { for( std::vector<sco_reference<T>*>::iterator it=m_references.begin(); it != m_references.end(); ++it ) { sco_reference<T>* pr = *it; pr->m_to = NULL; } } }; | |
Просмотров: 309 | | |
Всего комментариев: 0 | |