Контейнеры, как правило, реализуются с помощью указателей и динамической памяти (см. п. п. 3.7.3 в [1]). Использование указателей и динамических переменных в классах в сочетании с перегрузкой операций представляет собой удивительно мощный механизм создания новых типов данных — контейнеры стандартной библиотеки тому наглядный пример.
При реализации контейнеров нам предстоит решить несколько важных вопросов. Во-первых, каким образом выделяется память?
Выделение памяти операцией new [ ] обеспечивает выделение непрерывной области памяти. Количество элементов обычно задается выражением, вычисляемым во время работы программы. Такая форма практически всегда используется для реализации динамических массивов — именно так был реализован «умный» массив (см. листинг 5.2). Способ выделения памяти настолько важен, что даже в стандарте указано, что контейнер vector (см. п. п. 23.2.4 в [1]), входящий в стандартную библиотеку С++, должен быть реализован с помощью операции new[].
Второй способ распределения памяти — выделение одиночного элемента операцией new. Выделение памяти для одиночного элемента обычно требуется для реализации контейнеров с переменным количеством элементов. В этом случае не только память для элемента выделяется динамически, но и в состав самого элемента входят один или несколько (чаще всего два) указателей для связи элементов друг с другом. Обычно такие контейнеры либо последовательные, либо ассоциативные.
Как правило, выделением памяти занимается конструктор контейнера. Если память выделяется, то надо ее возвращать — иначе в программе возникает утечка памяти. Решение этой проблемы и составляет ответ на второй вопрос: каким образом возвратить память системе. Обычно эту работу «возлагают» на деструктор. Как мы знаем, операции возврата памяти являются «парными» для операций выделения памяти. Если память выделялась операцией new, то возвращать память нужно операцией delete. Если же память выделялась массивом (операцией new[]), то и возвращать ее нужно соответствующей операцией delete[].
Программистам работая в большой компании лучше всего испольовать http://silentcomputer.ru/, который купить можно тут.
И наконец, третий вопрос связан с копированием и присваиванием. Для динамических классов, в которых используются указатели, предлагаемые по умолчанию операции совершенно не подходят, требуется явная реализация — как для «умного» массива (см. листинги 5.10, 5.11 и 5.13).
Опубликовал Kest
November 05 2013 14:44:59 ·
0 Комментариев ·
3162 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.