Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Диплом_Frozen / пояснительная записка / пояснительная записка.doc
Скачиваний:
39
Добавлен:
16.04.2013
Размер:
4.04 Mб
Скачать

2.4.1. Умные указатели

Практически в любой более-менее сложной программе необходимо работать с динамическим выделением памяти. Как правило, это единственный способ создать неопределенное число объектов или объект переменного размера. Ошибки при работе с динамической памятью – одни из самых массовых и в тоже время одни из самых трудно локализуемых.

Библиотека STL, предоставляя мощные средства управления памятью, тем не менее не избавляет программиста от возможных ошибок. Частая ошибка – возврат адреса локальной переменной – контролируется только компилятором. Широкое использование механизма исключений и вообще, любой развитый механизм обработки ошибок, требует, чтобы все динамические объекты удалялись вовремя.

Как известно, деструктор локального объекта всегда вызывается в конце области видимости, независимо от причины, по которой объект эту область видимость покинул. Аналогично, компилятор гарантирует, что деструктор члена класса всегда будет вызван при уничтожении объекта. Возникает идея поручить компилятору, посредством классов-обёрток, автоматически отслеживать время жизни динамических объектов. Классы, ведущие себя как указатели на объект и реализующие такое отслеживание принято называть умными указателями (smartpointers).

Рассмотрим использованные при разработке проекта умные указатели. Это шаблон auto_prtиз стандартной библиотеки языкаC++ и шаблоныweak_prtиshared_prtиз библиотекиboost.

Все перечисленные шаблоны перегружают операторы так, что создаётся впечатление, что работа происходит с обычными указателями (разумеется, за исключением указательной арифметики, которая для умных указателей бессмысленна).

Шаблон auto_ptrподходит в тех случаях, когда в каждый момент времени у объекта имеется только один владелец. В большинстве реализацийauto_ptrпредставляет собой класс, в деструкторе которого происходит вызовdelete() для указателя, переданного в конструктор. Кроме того, вauto_ptrесть битовый флаг, показывающий, принадлежит ли данному экземпляруauto_ptrправо удаления объекта – при копированииauto_ptrфлаг выставляется в истину у вновь создаваемого, и в ложь у старогоauto_ptr; согласно этому флагу в деструкторе вызывается или не вызывается деструктор для хранимого указателя.

Шаблоны weak_ptrиshared_ptrбиблиотекиboostявляются довольно мощными реализациями указателей с подсчетом ссылок. Поскольку их применение вVFSбыло эпизодическим, а в конечной версии исключено за ненадобностью, подробно рассматриваться здесь они не будут.

При все своей элегантности и полезности, умные указатели не решают проблему окончательно. Основные источники ошибок следующие:

1) множественные ссылки (один умный указатель уже удалил объект, а какой-то другой указатель продолжает ссылаться на него); чаще всего проблема возникает при одновременном использовании простых и умных указателей;

2) циклические связи; возникают только при использовании умных указателей с счётчиками ссылок; приводят к невозможности корректного уничтожения контролируемых объектов и, как следствие, к утечкам памяти.

Соседние файлы в папке пояснительная записка
  • #
    16.04.2013190.46 Кб24UML-диаграмма system.vsd
  • #
    16.04.2013207.87 Кб25UML-диаграмма VFS (общая).vsd
  • #
    16.04.201399.33 Кб23UseCase всей VFS.vsd
  • #
    16.04.2013106.5 Кб23Входные и выходные данные.vsd
  • #
    16.04.2013112.13 Кб24Общая схема работы модуля.vsd
  • #
  • #
    16.04.2013109.57 Кб23Схема алгоритма get_descriptor.vsd
  • #
    16.04.2013106.5 Кб23Схема алгоритма get_files.vsd
  • #
    16.04.2013100.35 Кб23Схема алгоритма mount.vsd
  • #
    16.04.201396.26 Кб24технологическая - Activity.vsd
  • #
    16.04.201379.87 Кб24технологическая - Class.vsd