Почему приведенный код работает у меня без ошибок?
int* func() {
int var = 100;
return &var;
}
int main()
{
int* ptr = func();
cout << *ptr; // печатает 100, хотя здесь я ждал ошибки или неопределённого поведения, ведь var должна быть уже удалена к этому моменту
}
Я возвращаю адрес на локальную переменную var, которая должна была удалиться при выходе из func(), но я всё равно могу обратиться к ней (cout << *ptr;)
Общий принцип -
Если вы переходите дорогу в неположенном месте, то это еще не значит, что вас обязательно должна сбить машина. А если не сбила - то это еще не значит, что можно переходить дорогу в неположенном месте...
#include <iostream>
using namespace std;
int* func()
{
int var = 100;
return &var;
}
int z()
{
int u[5] = { };
return u[3];
}
int main()
{
int* ptr = func();
cout << *ptr << endl;
cout << z() << endl;
cout << *ptr << endl;
}
Компилируем VC+2017 с ключиком /Od, и получаем на выходе
100
0
1677336624
Просто у вас стек портится не мгновенно :)...
Напечатать 100 - это один из множества вариантов неопределенного поведения.
Неопределенное поведение не тождественно ошибке.
Может быть ошибка, может быть то, что вы ожидали, а может и еще что-нибудь
Сборка персонального компьютера от Artline: умный выбор для современных пользователей