Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 4. Как сделать так, чтобы вас уважали и ценили?
Как сделать лучше себе и другим людям
Как сделать свидание интересным?
Категории:
АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника
|
Нормально завершаться, открыв файл, но не получив его блокировки. Можно
Использовать два класса FilePointer и LockPointer для представления полученных Ресурсов (если ресурсы одного типа, то можно ограничиться одним классом). Выделение ресурса реализуется путем инициализации локального объекта, представляющего ресурс: class X { private: FilePointer a; LockPointer b; //..... public: X(const char* aa, const char* bb) : a(aa), // выделение 1-го ресурса b(bb) // выделение 2-го ресурса { } //.... }; Теперь при создании локального объекта реализация класса позаботится обо всей «бухгалтерии». Например, исключение возникло при создании a, но еще До создания b. В этом случае будет вызван деструктор для переменной a, но не Для b. Это означает, что если мы используем рассмотренную простую модель Управления ресурсами, то все будет нормально и, что особенно важно, автору Конструктора не нужно писать код для обработки исключений. Наиболее часто запрашиваемый ресурс – это динамическая память. Обычно выделение памяти выглядит так: class X { private: int* p; //..... public: X(int s) { p = new int[s]; init(); } ~X() { delete p; } //..... }; Однако такая техника при использовании совместно с исключениями может привести к «утечке» памяти. В частности, если исключение заявлено функцией Init(), то выделенная память не будет освобождена, поскольку объект полностью не создан и деструктор для него вызван не будет. Более безопасный вариант может выглядеть следующим образом: template<class T> class MemPtr { private: T* p; public: MemPtr(unsigned s) { p = new T[s]; } ~MemPtr() { delete p; } operator T*() { return p; } }; class X { private: MemPtr<int> ip; //..... public: X(int s): ip(s) { init(); } }; Освобождение памяти, занятой под массив, на который указывает ip, теперь Выполняется в MemPtr. Теперь, если функция init() заявит исключение, память Date: 2015-12-12; view: 364; Нарушение авторских прав |