8.4.3. Динамическое создание и уничтожение массивов
8.4.3. Динамическое создание и уничтожение массивов
Оператор new может выделить из хипа память для размещения массива. В этом случае после спецификатора типа в квадратных скобках указывается размер массива. Он может быть задан сколь угодно сложным выражением. new возвращает указатель на первый элемент массива. Например:
// создание единственного объекта типа int
// с начальным значением 1024
int *pi = new int( 1024 );
// создание массива из 1024 элементов
// элементы не инициализируются
int *pia = new int[ 1024 ];
// создание двумерного массива из 4x1024 элементов
int (*pia2)[ 1024 ] = new int[ 4 ][ 1024 ];
pi содержит адрес единственного элемента типа int, инициализированного значением 1024; pia – адрес первого элемента массива из 1024 элементов; pia2 – адрес начала массива, содержащего четыре массива по 1024 элемента, т.е. pia2 адресует 4096 элементов.
В общем случае массив, размещаемый в хипе, не может быть инициализирован. (В разделе 15.8 мы покажем, как с помощью конструктора по умолчанию присвоить начальное значение динамическому массиву объектов типа класса.) Задавать инициализатор при выделении оператором new памяти под массив не разрешается. Массиву элементов встроенного типа, размещенному в хипе, начальные значения присваиваются с помощью цикла for:
for (int index = 0; index 1024; ++index )
pia[ index ] = 0;
Основное преимущество динамического массива состоит в том, что количество элементов в его первом измерении не обязано быть константой, т.е. может не быть известным во время компиляции. Для массивов, определяемых в локальной или глобальной области видимости, это не так: здесь размер задавать необходимо.
Например, если указатель в ходе выполнения программы ссылается на разные C-строки, то область памяти под текущую строку обычно выделяется динамически и ее размер определяется в зависимости от длины строки. Как правило, это более эффективно, чем создавать массив фиксированного размера, способный вместить самую длинную строку: ведь все остальные строки могут быть значительно короче. Более того, программа может аварийно завершиться, если длина хотя бы одной из строк превысит отведенный лимит.
Оператор new допустимо использовать для задания первого измерения массива с помощью значения, вычисляемого во время выполнения. Предположим, у нас есть следующие C-строки:
const char *noerr = "success";
// ...
const char *err189 = "Error: a function declaration must "
"specify a function return type!";
Размер создаваемого с помощью оператора new массива может быть задан значением, вычисляемым во время выполнения:
#include cstring
const char *errorTxt;
if (errorFound)
errorTxt = errl89;
else
errorTxt = noerr;
int dimension = strlen( errorTxt ) + 1;
char *strl = new char[ dimension ];
// копируем текст ошибки в strl
strcpy( strl, errorTxt );
dimension разрешается заменить выражением:
// обычная для С++ идиома,
// иногда удивляющая начинающих программистов
char *strl = new char[ str1en( errorTxt ) + 1 ];
Единица, прибавляемая к значению, которое возвращает strlen(), необходима для учета завершающего нулевого символа в C-строке. Отсутствие этой единицы – весьма распространенная ошибка, которую достаточно трудно обнаружить, поскольку она проявляет себя косвенно: происходит затирание какой-либо другой области программы. Почему? Большинство функций, которые обрабатывают массивы, представляющие собой С-строки символов, пробегают по элементам, пока не встретят завершающий нуль.
Если в конце строки нуля нет, то возможно чтение или запись в случайную область памяти. Избежать подобных проблем позволяет класс string из стандартной библиотеки С++.
Отметим, что только первое измерение массива, создаваемого с помощью оператора new, может быть задано значением, вычисляемым во время выполнения. Остальные измерения должны задаваться константами, известными во время компиляции. Например:
int getDim();
// создание двумерного массива
int (*pia3)[ 1024 ] = new int[ getDim() ][ 1024 ]; // правильно
// ошибка: второе измерение задано не константой
int **pia4 = new int[ 4 ][ getDim() ];
Оператор delete для уничтожения массива имеет следующую форму:
delete[] str1;
Пустые квадратные скобки необходимы. Они говорят компилятору, что указатель адресует массив, а не единичный элемент. Поскольку тип str1 – указатель на char, без этих скобок компилятор не поймет, что удалять следует целый массив.
Отсутствие скобок не является синтаксической ошибкой, но правильность выполнения программы не гарантируется (это особенно справедливо для массивов, которые содержат объекты классов, имеющих деструкторы, как это будет показано в разделе 14.4).
Чтобы избежать проблем, связанных с управлением динамически выделяемой памятью для массивов, рекомендуется пользоваться контейнерными типами из стандартной библиотеки, такими, как vector, list или string. Они управляют памятью автоматически. (Тип string был представлен в разделе 3.4, тип vector – в разделе 3.10. Подробное описание контейнерных типов см. в главе 6.)
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Уничтожение программы
Уничтожение программы Любой объект на уровне MI, который можно создать, можно и уничтожить. Соответственно на каждую команду создания объектов MI приходится команда уничтожения. Пользователь на уровне MI устанавливает системный указатель на программу или другой объект MI и
Уничтожение
Уничтожение Допустим, вы обнаружили, что ваш компьютер кишмя кишит всевозможными вирусами. Что делать?– Ни в коем случае не поддавайтесь панике! Наверное, ни один вирус не сможет натворить столько бед, сколько смогут дрожащие руки перепуганного пользователя. Поэтому
4.19. Создание массивов RAID
4.19. Создание массивов RAID Идея надежности хранения данных волновала, волнует и будет волновать не одно поколение системных администраторов и пользователей. Используемые в ОС Linux файловые системы ext2 и ext3 обладают достаточной степенью надежности, но зачастую этого
Создание массивов
Создание массивов Массивом называют множество однородных предметов, образующих единое целое. Массивы программы AutoCAD – это совокупность копий одного объекта, расположенных на равном расстоянии друг от друга. Так как массивы связаны со смещением координат, они могут быть
11.3.3. Динамическое создание экземпляра класса, заданного своим именем
11.3.3. Динамическое создание экземпляра класса, заданного своим именем Такой вопрос мы видели многократно. Пусть дана строка, содержащая имя класса; как можно создать экземпляр этого класса?Правильный способ — воспользоваться методом const_get, который мы только что
3.1.3. Уничтожение процесса
3.1.3. Уничтожение процесса Для уничтожения процесса предназначена команда kill. Ей достаточно указать идентификатор требуемого процесса.Команда kill посылает процессу сигнал SIGTERM, являющийся запросом на завершение.[10] По умолчанию, если в программе отсутствует обработчик
8.4.1. Динамическое создание и уничтожение единичных объектов
8.4.1. Динамическое создание и уничтожение единичных объектов Оператор new состоит их ключевого слова new, за которым следует спецификатор типа. Этот спецификатор может относиться к встроенным типам или к типам классов. Например:new int;размещает в хипе один объект типа int.
8.4.4. Динамическое создание и уничтожение константных объектов
8.4.4. Динамическое создание и уничтожение константных объектов Программист способен создать объект в хипе и запретить изменение его значения после инициализации. Этого можно достичь, объявляя объект константным. Для этого применяется следующая форма оператора new:const int
Уничтожение томатов
Уничтожение томатов К сожалению, в данный момент при столкновении сыра с помидорами ничего не происходит. Ситуацию надо исправить при помощи кода, добавленного в метод updatePosition, который приведен в листинге 11.30.Листинг 11.30// Уничтожаем помидоры при столкновении с сыромfor (int
Создание массивов
Создание массивов Массивом называют множество однородных предметов, образующих единое целое. Массивы программы AutoCAD – это совокупность копий одного объекта, расположенных на равном расстоянии друг от друга. Так как массивы связаны со смещением координат, они могут быть
Уничтожение одного элемента.
Уничтожение одного элемента. 1. Кликните дважды на элемент (заголовок, параграф, стихи и т. д.).2. Нажмите иконку BookCorrector "delete" или кликните правой кнопкой мышки внутри основного окна BookDesigner и затем нажмите "delete" в появившемся
3.3.3. Уничтожение фонового задания
3.3.3. Уничтожение фонового задания Сигнал о завершении посылается процессу командой kill:kill [-сигнал] номер_процессаДалее в этой книге мы рассмотрим, какие существуют сигналы. Пока же достаточно знать, что по умолчанию команда kill посылает сигнал номер 1 — HUP (hang?up -oтбой). На
Динамическое создание и повторное связывание
Динамическое создание и повторное связывание Что не было показано при описании структуры объектов периода выполнения, так это в высшей степени динамичная природа настоящей ОО-модели. Статическая и ориентированная на стеки политика управления объектами характерна для
Создание массивов и работа с ними
Создание массивов и работа с ними Массив — это пронумерованный набор переменных одного типа, называемых элементами массива. Доступ к нужному элементу массива выполняется по его порядковому номеру, называемому индексом. А общее число элементов массива называется его