Перейти до змісту

ЛР5. Значення, посилання, вказівники та час життя об’єктів

Коротко про роботу

Спочатку порівняйте копію, посилання та вказівник у двох послідовних експериментах. Потім перевірте безпечність адрес з урахуванням часу життя локальних об’єктів. Варіант визначає STUDENT_X.

Відкрити робочий зошит Як виконувати лабораторні

1. Умова

Спочатку порівняйте копію, посилання та вказівник у двох послідовних експериментах. Потім перевірте безпечність адрес з урахуванням часу життя локальних об’єктів.

Перша комірка зошита лише показує значення вашого STUDENT_X разом із типами. Вона не оголошує і не створює предметні змінні. У коді кожного завдання перенесіть потрібні значення та самостійно оголосіть/створіть відповідні змінні.

2. Що треба знати

Робота виконується після Л1–Л3. Потрібні поняття:

  1. копія значення
  2. посилання &
  3. адреса та вказівник *
  4. nullptr
  5. локальна область видимості
  6. час життя об’єкта
  7. розіменування вказівника
  8. висячий стан і невизначена поведінка

Межа матеріалу

Використовуйте поняття, вивчені до Л1–Л3. Не використовуйте динамічне виділення пам’яті через new/delete, unique_ptr або інші засоби, яких ще не було в лекціях.

3. Варіант, вхідні дані та результат

У зошиті заповніть STUDENT_NAME, STUDENT_GROUP і STUDENT_X від 1 до 30.

Вхідні дані

Поле Тип Зміст
base int початкове значення першого об’єкта
other int початкове значення другого об’єкта
copy_delta int зміна копії
ref_delta int зміна через посилання
ptr_delta int зміна через перше розіменування
pointer_new_value int значення після перепризначення вказівника
archetype int номер схеми фрагмента
outer_value int значення зовнішнього об’єкта
inner_value int значення внутрішнього об’єкта
starter_code текстовий фрагмент фрагмент для аналізу

Поля результату

Поле Зміст
copy_x оригінал після зміни копії
copy_y копія після зміни
reference_x об’єкт після зміни через посилання
pointer_a перший об’єкт після роботи через вказівник
pointer_b другий об’єкт після перепризначення
pointer_points_to_b чи вказує p наприкінці на b
final_access_safe чи безпечний фінальний доступ
unsafe_line_number номер небезпечного рядка або 0
safe_result результат після безпечного виправлення

Назви полів результату не змінюйте. Перша комірка лише показує значення варіанта і не оголошує предметні змінні. Перед розв’язанням кожного завдання самостійно оголосіть потрібні вхідні змінні з показаними значеннями. Власні та результуючі змінні також оголошуйте звичайно, як у лекційних прикладах. Обчислення виконуйте у блоці { ... }; код над блоком використовуйте лише там, де це позначено. Наприкінці блока вже є службовий рядок самоперевірки для контрольних полів — його не потрібно писати або змінювати. Формат std::cout обирайте за змістом завдання: спеціального формату для самоперевірки немає.

4. Терміни і правила

Терміни

  • копія — окремий об’єкт із власним значенням.
  • посилання — друге ім’я вже наявного об’єкта.
  • вказівник — об’єкт, який зберігає адресу іншого об’єкта.
  • розіменування — доступ до об’єкта за адресою через *p.
  • час життя об’єкта — період від створення об’єкта до його знищення.
  • висячий вказівник — вказівник, що зберіг адресу об’єкта, час життя якого вже завершився.

Правила

  1. У фрагменті «Копія» змінна y є окремою копією значення x.
  2. У фрагменті «Посилання» ім’я alias позначає той самий об’єкт, що й x_ref.
  3. До p = &b вказівник p зберігає адресу a. Після цієї інструкції він зберігає адресу b.
  4. pointer_points_to_b має значення true, якщо наприкінці p вказує на b.
  5. starter_code є повною умовою для аналізу коду. Мітки R1, R2, ... позначають рядки для відповіді.
  6. final_access_safe має значення true, коли фінальний доступ звертається до живого об’єкта.
  7. unsafe_line_number дорівнює номеру небезпечного фінального рядка; для безпечного фрагмента використовуйте 0.
  8. safe_result — значення, яке має отримати мінімальне безпечне виправлення зі збереженням задуму фрагмента.

Код для трьох експериментів

Кожний фрагмент запускайте окремо з даними свого варіанта. Перед запуском запишіть прогноз, який прямо вимагає відповідне завдання.

// Копія
int x{base};
int y{x};
y += copy_delta;

// Посилання
int x_ref{base};
int& alias{x_ref};
alias += ref_delta;

// Вказівник
int a{base};
int b{other};
int* p{&a};
*p += ptr_delta;
p = &b;
*p = pointer_new_value;

5. Завдання

Завдання 1

Спрогнозуйте значення x і y, виконайте фрагмент «Копія» та запишіть результат у copy_x і copy_y.

Завдання 2

Спрогнозуйте значення x_ref, виконайте фрагмент «Посилання» та запишіть результат у reference_x. Одним реченням поясніть роль alias.

Завдання 3

Спрогнозуйте значення a, b і ціль p. Запишіть pointer_a, pointer_b і pointer_points_to_b.

Завдання 4

Прочитайте starter_code. Позначте, де починається і закінчується час життя кожного локального об’єкта.

Завдання 5

Визначте, чи безпечний фінальний доступ. Запишіть final_access_safe і unsafe_line_number.

Завдання 6

Виправте фрагмент так, щоб не було доступу через висячий вказівник. Запишіть результат у safe_result.

6. Перевірка і здача

  1. Запустіть самоперевірку та виправте помилки.
  2. Перезапустіть ядро і виконайте роботу ще раз від початку.
  3. Збережіть .ipynb і PDF з кодом та результатами.

Назва PDF: LR05_Прізвище_Група_VNN.pdf.