1. Чи є в наступному коді помилка роботи з динамічною пам’яттю?
const char* c = new char[20] {"Hello, world!"};
std::cout << c << std::endl;
delete c;
2. Чи будуть вказувати str1 та str2 на однакову адресу?
const char* str1 = "Hello, world!";
const char* str2 = "Hello, world!";
3. Яким є розмір об’єкта наступної структури і чому?
struct Struct {
int method();
};
4. По порядку опишіть дії, які виконуються перед початком кожної ітерації циклу в коді нижче. Коли цикл зупиниться?
const char* c = "Hello, world!";
char v;
while (v = *c++) {
// ...
}
Відповідь:
- Так, використано оператор delete а не delete[]. Хоч це не завжди матиме негативні наслідки (як, наприклад, витік пам’яті), але завжди є помилкою з точки зору логіки роботи програми.
- Не обов’язково. Хоча зазвичай адреса буде одна і та ж, але стандарт C++ не визначає те, як зберігаються однакові літерали.
- Попри те, що в Struct немає полів, розмір об’єкта буде 1 байт. Якби розмір був 0, то адреса такого об’єкта співпадала би з адресою іншої змінної, якщо алокація відбувається на стеку. Також було б неможливо алокувати масив об’єктів даного типу, бо це завжди 0 байт, незалежно від кількості об’єктів.
- Перед початком кожної ітерації відбуваються наступні окремі дії:
- Вказівник c збільшується на 1 — зсув на один символ вперед. Постінкремент має більший пріоритет ніж розіменування. Результат роботи постінкремента — вказівник на попередній символ. Тобто для найпершого кроку вираз “c++” повертає вказівник на символ ‘H’, а не на ‘e’, хоча змінна с вже буде вказувати на ‘e’.
- Відбувається розіменування вказівника, отриманого в попередньому кроці.
- Для найпершого кроку, “*c++” перетвориться в ‘H’.
- Результат попереднього кроку присвоюється змінній v.
- Перевіряється, чи змінна v дорівнює нулю, що є числовим значенням символа ‘\0’, який неявно проставлений після останнього символу ‘!’. Якщо дорівнює, то цикл припинить роботу.
Добавить комментарий