Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
методичка6.docx
Скачиваний:
5
Добавлен:
17.11.2018
Размер:
32.96 Кб
Скачать

Int higgens;

int * pi = &higgens;

имяТипа имяУказателя = new имяТипа;

15. Освобождение памяти с помощью оператора delete. Приведите

пример.

Использование оператора new для запроса памяти тогда, когда

вам это необходимо, является наиболее эффектной стороной механизма

управления памятью в C++. Другой стороной является оператор delete,

который позволяет вам возвратить память в пул памяти после того, как

вы закончите ее использовать. Это является важным шагом к наиболее

эффективному использованию памяти. Память, которую вы

возвращаете или освобождаете, может быть повторно использована

другими частями программы. При использовании оператора delete за

ним должен следовать указатель на блок памяти, изначально

зарезервированный с помощью оператора new:

int * ps = new int; // выделение памяти

// с помощью new ...

// использование памяти

delete ps;

// очистка памяти с помощью delete по окончании выполнения программы

В этом примере очищается область памяти, на которую указывает

ps, но сам указатель ps не удаляется.

16. Можно-ли повторно очистить блок памяти, который уже

освободили?

Не следует пытаться повторно очистить блок памяти, который уже

освободили. Результат такого действия не определен. Невозможно

также использовать оператор delete для освобождения памяти,

созданной объявленными переменными

17. Прокомментируйте листинг.

int * ps = new int; // хорошо

delete ps; // хорошо

delete ps; // не очень хорошо

int jugs =5; // хорошо

15

int * pi = & jugs; // хорошо

delete pi; // не разрешено, память не распределена

//оператором new

18. Создание динамического массива с помощью оператора new.

Создать динамический массив в C++ просто. Необходимо указать

оператору new тип элементов массива и их желаемое количество.

Синтаксис требует, чтобы было указано имя типа, а за ним —

количество элементов в квадратных скобках. Например, если нужен

массив из десяти переменных типа int, выполните следующее:

int * psome = new int [10] ; //получение блока из 10 значений типа int

19. Как освободить память занятую динамическим массивом.

Необходимо согласовать количество вызовов оператора new с

количеством вызовов оператора delete, чтобы тогда, когда программа

закончит использование этого блока памяти, она его освободила. Когда

для создания массива используется оператор new, следует употребить

другую форму оператора delete, которая указывает, что освобождается

именно массив:

delete [] psome; // освобождается динамический массив

Квадратные скобки свидетельствуют о том, что необходимо освободить

целый массив, а не только элемент, на который указывает указатель.

20. Прокомментируйте листинг.

int * pi = new int;

short * ps = new short [500] ;

delete [] pi; // результат не определен не делайте так

delete ps; // результат не определен, не делайте так

21. Коротко перечислите правила, которые необходимо соблюдать

при использовании операторов new и delete

Не используйте оператор delete для освобождения памяти,

которую не распределяли с помощью оператора new.

Не используйте оператор delete для освобождения одного и того

же блока памяти дважды подряд.

Используйте оператор delete [], если был применен оператор

new [] для распределения массива.

Используйте оператор delete (без квадратных скобок), если был

применен оператор new для распределения одного элемента.

Безопасно применять оператор delete к нулевому указателю

(ничего не происходит).

22. Можно-ли использовать оператор sizeof() для определения

количества байтов в динамически распределенном массиве.

Обычно программа не следит за объемом распределяемой памяти,

поэтому важно правильно освобождать ее в дальнейшем — путем

использования оператора delete []. Но эта информация не является

общедоступной — вы не можете применить оператор sizeof, например,

для определения количества байтов в динамически распределенном

массиве

23. Как вызвать какой-либо из элементов динамического массива?

. Общая форма распределения и выделения памяти для массива

такова:

type_name pointer_name = new type_name [num_elements] ;

24. Верно-ли высказывание “в языке C++ имя массива

интерпретируется как адрес.”

Да, как адрес первого элемента массива

25. Верно-ли высказывание “в большинстве контекстов C++

интерпретирует имя массива как адрес его первого элемента.”

Да

26. Что будет если прибавить единицу к переменной-указателю?

Сдвинется на единицу байтов

27. Эквивалентны-ли записи:

rambler[1]=1;

*(rambler+1)=1;

Поясните ответ.

Да, применяется операция разыменовывание

28. Приведите пример иллюстрирующий различие при применении

имен указателей и имен массивов, если указатель ссылается на

массив.

В

результате выполнения этой операции возвращается разница между

двумя элементами.

Примеры:

int tacos[10] = {5,2,8,4,1,2,2,4,6,8};

int * pt = tacos; // предположим, что pf и

// fog — это адрес 3000

pt = pt + 1; // теперь pt равно 3004, если

// int занимает четыре байта

int *ре = & tacos [9]; // ре равно 3096,

// если int занимает четыре байта

ре = ре -1; // теперь ре равно 3032,

// адрес facos[8]

int diff = ре - pt; // diff равен 4,

// разница между facos[8] и facos[l]