Суббота, 18.05.2024, 15:03Приветствую Вас Гость | RSS
IT Solutions
Меню сайта
Наш опрос
Оцените мой сайт
Всего ответов: 407
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Каталог статей


Главная » Статьи » Мои статьи

Выделенные ресурсы должны принадлежать объекту
Идиома RAII (Resource Acquisition Is Initialization) заключается в том, что некоторый ресурс захватывается в конструкторе объекта, и освобождается в его деструкторе. А поскольку деструктор локальных объектов вызывается автоматически при выходе из метода (или просто из области видимости) не зависимо от причины (нормальное завершение метода или при генерации исключения), то использование этой идиомы является самым простым и эффективным способом написания сопровождаемого C++ кода, безопасного с точки зрения исключений.

Симметрия "конструктор\деструктор" воспроизводит симметрию, присущую парам функций "захвата\освобождения" ресурса, таким как new\delete, lock\unlock, fopen\fclose.

Это делает стековые объекты ( или объекты со счётчиком ссылок ), в конструкторе которых происходит захват ( а в деструкторе освобождение) ресурса превосходным инструментом для автоматизации управления ресурсами.

Автоматизация легко реализуема, недорога и безопасна.
Если ресурс требует спаривания вызовов функций захвата\освобождения, то лучше его инкапсулировать в объект, который выполнит всё за вас.



Если копирование лишено смысла, то копирующий конструктор и оператор присваивания можно явно запретить, сделав их private и не определяя.
Иначе копирующий конструктор дублирует ресурс или использует счётчик ссылок на него.
То же самое делает и operator=, при необходимости освобождая ресурс, которым владел до присваивания.
Обычно генерируемые компилятором версии этих функций не подходят.

Все ресурсы должны принадлежать объектам. Динамически выделенные надо хранить с помощью интеллектуальных указателей.
Каждое явное выделение ресурса должно быть в отдельной инструкции, тут же передающей его объекту.
Иначе может возникнуть утечка ресурсов, связанная с тем, что порядок вычисления параметров функции не определён.



Исключение: 
Обычные указатели можно использовать в коде, когда указываемый объект виден только в ограниченном объёме.
Например, внутри класса типа указателя на узел дерева в классе Tree, использующийся для навигации по дереву.
Категория: Мои статьи | Добавил: B@R_LOG (18.11.2013)
Просмотров: 745 | Рейтинг: 4.9/72
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Форма входа
Категории раздела
Мои статьи [11]
Поиск
Друзья сайта
  • МЫ в "ВКонтакте"
  • Система Orphus