Почему приведенный код работает у меня без ошибок?
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 - это один из множества вариантов неопределенного поведения.
Неопределенное поведение не тождественно ошибке.
Может быть ошибка, может быть то, что вы ожидали, а может и еще что-нибудь
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Есть два класса с одинаковыми именами, которые находятся в разных файлах ( но с одинаковыми названиями ) в разных папкахКлассы обёрнуты в разные...
Пытаюсь разобраться в многопоточности и mutexПо задумке сначала должен выполниться thread Calc(Stream), после его окончания должен выполниться thread...