#include
#include
2 : using namespace std;
3:
4: int main()
5:
|
{
|
"Enter your
|
name: ";
|
6:
|
cout «
|
7:
|
string Name;
|
|
8 :
|
cin »
|
Name;
|
|
9:
|
// Добавить 1 к резервируемому объему памяти для завершающего
|
1 0 :
|
|
// нулевого символа
|
= Name.length() + 1;
|
1 1 :
|
int CharsToAllocate
|
1 2 :
|
|
|
|
// запрос памяти для содержания копии ввода
char* CopyOfName = new char [CharsToAllocate];
// strcpy копирует из строки с завершающим нулевым символом
strcpy(CopyOfName, Name.c_str());
18:
// Отобразить скопированную строку
2 0 : cout « "Dynamically allocated buffer contains: " « CopyOfName
endl;
2 1 :
2 2 : // Буфер больше не используется? Удалить его
delete[] CopyOfName;
return 0;
}
Результат
Enter your name: Siddhartha
Dynamically allocated buffer contains: Siddhartha
Динамическое распределение памяти
|
179
|
Анализ
Самыми важными являются строки И и 23, где используются операторы new и d e -
_ ete [ ] соответственно. По сравнению с листингом 8.7, где резервировалось место только лля одного элемента, здесь резервируется блок памяти для нескольких элементов. Такому резервированию массива элементов должно соответствовать освобождение с использо ванием оператора d e l e t e [ ] , чтобы освободить память по завершении ее использования. Количество резервируемых символов вычисляется в строке 11 как на единицу большее, чем количество символов, введенных пользователем, чтобы разместить завершающий символ NULL, который важен в строках стиля С. Потребность в завершающем символе NULL объяснялась на занятии 4, “ М ассивы и строки”. Ф актическое копирование осу ществляется в строке 17 оператором s t r c p y , который использует метод c _ s t r () строки
::ате, предоставляемый классом s t d : : s t r i n g , чтобы скопировать ее в символьный буфер IcpyOfName.
ПРИМЕЧАНИЕ
Операторы new и delete резервируют область в динамической памяти. Д и
намическая память (free store) - это абстракция памяти в форме пула памяти,
который ваше приложение может распределять (allocate) (т.е. резервировать
(reserve) области) и возвращать (de-allocate) (т.е. освобождать (release)).
Воздействие операторов инкремента и декремента (++ и -) на указатели
Указатель содержит адрес области памяти. Например, указатель на целое число в ли стинге 8.3 содержит значение 0 x 0 0 2 E F B 3 4 — адрес, по которому размещается целое чис ло. Само целое число имеет длину 4 байта, а следовательно, занимает в памяти четыре «еста от 0 x 0 0 2 E F B 3 4 до 0 x0 0 2 E F B 3 7 . Приращение значения этого указателя с использо ванием оператора (++) не даст значения 0 x0 0 2 E F B 3 5 , указывающего на середину целого числа, что было бы бессмысленно.
Операция инкремента (приращения) или декремента с указателем интерпретируется компилятором как потребность перевода указателя на следующее значение в блоке памя ти, с учетом того, что он имеет тот же тип, а не на следующий байт (если тип значения не кмеет длину в 1 байт, как, например тип ch a r) .
Так, результатом инкремента такого указателя, как p l n t e g e r из листинга 8.3, будет
.ъеличение его значения на 4 байта, что соответствует размеру типа i n t . Использование гператора ++ для этого указателя говорит компилятору, что вы хотите перевести его на следующее расположенное далее целое число. Следовательно, после приращения указа тель будет указывать на адрес 0 x0 0 2 E FB 3 8 . Точно так же добавление 2 к этому указателю привело бы к его переводу на 2 целых числа далее, что составит 8 байтов вперед. Впослед ствии вы увидите корреляцию между этим поведением, демонстрируемым указателями, и индексами, используемыми в массивах.
Декремент указателя с использованием оператора (-) демонстрирует тот же эффект — значение, содержавшееся в указателе адреса, уменьшается на размер типа данных, на ко торые он указывает.
ЗАНЯТИЕ 8. Указатели и ссылки
Do'stlaringiz bilan baham: |