Добре, я думаю, що всі ми згодні з тим, що те, що відбувається із наступним кодом, не визначено, залежно від того, що передано,
void deleteForMe(int* pointer)
{
delete[] pointer;
}
Вказівник може бути різними різними речами, і тому виконання безумовного delete[]
на ньому не визначено. Однак припустимо, що ми дійсно передаємо вказівник масиву,
int main()
{
int* arr = new int[5];
deleteForMe(arr);
return 0;
}
Моє запитання в цьому випадку, коли вказівник є масивом, хто це знає? Я маю на увазі, з точки зору мови / компілятора, він не має поняття, є чи ні arr
вказівник масиву проти вказівника на один int. Чорт, навіть не знає, чи arr
було створено динамічно. Але якщо я роблю наступне,
int main()
{
int* num = new int(1);
deleteForMe(num);
return 0;
}
Операційна система достатньо розумна, щоб видалити лише один int і не переходити на якийсь тип "вбивства", видаляючи решту пам'яті поза цією точкою (на відміну від цієї strlen
та не закінченої \0
рядка - вона продовжуватиме роботу, поки вона не буде звернень 0).
То чия робота - це пам’ятати ці речі? Чи зберігає ОС деякий тип запису у фоновому режимі? (Я маю на увазі, я розумію, що я почав цю посаду, сказавши, що те, що відбувається, не визначено, але факт полягає в тому, що сценарій "вбивства" не відбувається, тому в практичному світі хтось пам'ятає.)