|
Программирование >> Дополнительные возможности наследования
значение 10. Переход к следующему объекту массива осуществляется за счет приращения адреса в указателе на массив, после чего тем же способом присваивается значение 20 второму объекту массива. Указатель на массив или массив указатвлви Рассмотрим следующие три объявления: Cat Family0ne[500]; CAT RamilyTwo[500]; CAT * FamilyThree = new CAT[500]; В первом случае объявляется массив FamilyOne, содержащий 500 объектов типа CAT. Во втором случае - массив FamilyTwo, содержащий 500 указателей на объекты класса CAT, и в третьем случае - указатель FamilyThree, ссылающийся на массив из 500 объектов класса CAT. В зависимости от того, какое объявление используется в профамме, принципиально меняются способы управления массивом. Как ни странно, но указатель FamilyThree по сути своей гораздо ближе к массиву FamilyOne, но принципиально отличается от массива указателей FamilyTwo. Чтобы разобраться в этом, следует внимательно рассмотреть, что содержат в себе все эти переменные. Указатель на массив FamilyThree содержит адрес первого элемента массива, но ведь это именно то, что содержит имя массива FamilyOne. ИмБна массивов и указатвлви в С++ имя массива представляет собой константный указатель на первый элемент массива. Другими словами, в объявлении CAT Family[50]; создается указатель Family на адрес первого элемента массива &Fami]y[0]. В профамме допускается использование имен массивов как константных указателей и наоборот. Таким образом, выражению Family + 4 соответствует обращение к пятому элементу массива Family[4]. Компилятор выполняет с именами массивов те же математические действия сложения, инкремента и декремента, что и с указателями. В результате операция Family + 4 будет означать не прибавление четырех байтов к текущему адресу, а сдвиг на четыре объекта. Если размер одного объекта равен четырем байтам, то к адресу в имени массива будут добавлены не 4, а 16 байт. Если в нащем примере каждый объект класса CAT содержит четыре переменные-члена типа long по четыре байта каждая и две пере-менные-члена типа short по два байта каждая, то размер одного элемента массива будет равен 20 байт и операция Family + 4 сдвинет адрес в имени указателя на 80 байт. Объявление массива в динамической области памяти и его использование показано в листинге 12.7. Листинг 1Z.7. Созвание массива с исподьэрванием ндючевого слова new Листинг 12.7. Массив в динамической области памяти dlnclude <iostream,h> 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 class CAT { public; CATO { itsAge = 1; itsWelght=5; } CATO; int GetAgeO const { return itsAge; } int GetWeightO const { return ItsWeight; } void SetAge(lnt age) { ItsAge = age; } private; int itsAgo; int itsWeight; CAT : ; CATO { cout << Destructor called!\ n ; int mainO { CAT Family = new CAT[500]; int i; for (1=0; i < 500; i++) { Family[i].SetAge(2.i +1); for (1=0; 1 < 500; i++) { cout << Cat i+1 : ; cout << Fanily[i].GetAge() << endl; delete [] Family; return 0; } Cat #1 Cat #2 Cat #3 Cat #499: 997 Cat #500: 999 В строке 26 объявляется массив Family для пятисот объектов класса CAT. Благодаря использованию выражения new САТ[500] весь массив сохраняется в области динамической памяти. Удаление массива из области динамической памяти Куда деваются при удалении массива все эти объекты класса CAT, показанные в предыдущем разделе? Не происходит ли здесь утечка памяти? Удаление массива Family с помощью оператора delete[] (не забудьте установить квадратные скобки) освобождает все ячейки памяти, отведенные для него. Компилятор достаточно сообразительный, чтобы удалить из памяти все объекты удаляемого массива и освободить динамическую память для нового использования. Чтобы убедиться в этом, измените размер массива в предыдущей программе с 500 на 10 в строках 26, 29 и 34. Затем разблокируйте выражение в строке 21 с оператором cout и запустите программу. Когда будет выполнена строка 43, последует десять вызовов деструктора для удаления каждого объекта класса CAT в массиве Family. Создавая какой-либо объект в области динамической памяти с помощью ключевого слова new, всегда удаляйте его из памяти с помощью оператора delete, если этот объект больще не используется в программе. В случае создания массива в области динамического обмена выражением new <class>[si/e] удалять его из памяти нужно оператором delete[]. Квадратные скобки указывают, что удаляется весь массив. Если вы забудете установить квадратные скобки, то из памяти будет удален только первый объект массива. В этом можно убедиться, если в нашем примере программы удалить квадратные скобки в строке 38. Если уже были внесены изменения в строку 21, как указывалось выше, то при выполнении программы на экране отобразится вызов только одного деструктора объекта, который удалит первый объект массива. Поздравляем вас! Вы потеряли огромный блок памяти для дальнейшего использования профаммой. Рвкомвндувтся Помните, что для обращения к массиву из п элементов используются индексы ОТ0ДОП~1. Используйте свойства математических операций с указателями для управления доступом к элементам массива. Ив рвкомвнддвтся Не записывайте данные за пределы массива. Не путайте массив указателей с указателем на массив.
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |