MiddleДебаггингЧастоЕщё не отвечали
Что произойдёт при обращении к памяти после delete? Всегда ли будет crash?
Этот код читает по указателю после его удаления. В тестах он часто печатает правильное значение, но в продакшене читает устаревшие данные, портит другой объект или падает.
void run() {
int* p = new int(42);
delete p;
// ... посторонняя работа ...
std::cout << *p << '\n';
}
Найдите ошибку и объясните причину.
Доступ после delete — неопределённое поведение. Программа может упасть, выглядеть рабочей, прочитать старые данные, испортить другой объект или сломаться позже. Аллокатор может сразу переиспользовать этот блок, а стандарт C++ не даёт гарантий.
- ✗Считать отсутствие crash доказательством корректности кода
- ✗Обнулять один указатель и забывать, что другие алиасы остались висячими
- ✗Возвращать ссылки или указатели на локальные переменные
- →Как AddressSanitizer и Valgrind находят use-after-free?
- →Как RAII уменьшает число таких ошибок?