ЛР5. Значення, посилання, вказівники та час життя об’єктів
Коротко про роботу
Спочатку порівняйте копію, посилання та вказівник у двох послідовних експериментах. Потім перевірте безпечність адрес з
урахуванням часу життя локальних об’єктів. Варіант визначає STUDENT_X.
Відкрити робочий зошит Як виконувати лабораторні
1. Умова
Спочатку порівняйте копію, посилання та вказівник у двох послідовних експериментах. Потім перевірте безпечність адрес з урахуванням часу життя локальних об’єктів.
Перша комірка зошита лише показує значення вашого STUDENT_X разом із типами. Вона не оголошує і не створює предметні
змінні. У коді кожного завдання перенесіть потрібні значення та самостійно оголосіть/створіть відповідні змінні.
2. Що треба знати
Робота виконується після Л1–Л3. Потрібні поняття:
- копія значення
- посилання
& - адреса та вказівник
* nullptr- локальна область видимості
- час життя об’єкта
- розіменування вказівника
- висячий стан і невизначена поведінка
Межа матеріалу
Використовуйте поняття, вивчені до Л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. - час життя об’єкта — період від створення об’єкта до його знищення.
- висячий вказівник — вказівник, що зберіг адресу об’єкта, час життя якого вже завершився.
Правила
- У фрагменті «Копія» змінна
yє окремою копією значенняx. - У фрагменті «Посилання» ім’я
aliasпозначає той самий об’єкт, що йx_ref. - До
p = &bвказівникpзберігає адресуa. Після цієї інструкції він зберігає адресуb. pointer_points_to_bмає значенняtrue, якщо наприкінціpвказує наb.starter_codeє повною умовою для аналізу коду. МіткиR1,R2, ... позначають рядки для відповіді.final_access_safeмає значенняtrue, коли фінальний доступ звертається до живого об’єкта.unsafe_line_numberдорівнює номеру небезпечного фінального рядка; для безпечного фрагмента використовуйте0.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. Перевірка і здача
- Запустіть самоперевірку та виправте помилки.
- Перезапустіть ядро і виконайте роботу ще раз від початку.
- Збережіть
.ipynbі PDF з кодом та результатами.
Назва PDF: LR05_Прізвище_Група_VNN.pdf.