int v = 50;
int* a = &v;
return a;
}
int main() {
int* ptr = foo();
cout << *ptr;
return 0;
}
почему такая штука работает? разве память под v после вызова функции не должна была уничтожиться
Это UB. Расскажи, в каком смысле оно у тебя работает?
Уничтожиться?
Память не уничтожается, она просто ничем не занята. Ты не можешь гарантировать что в последствии по этому адресу будет то же значение, которое было, когда выполнялась функция
из-за того, что это значение должно стереться после вызова функции?
В крестах мыслить категориями сырой памяти в общем случае не рекомендуется, поскольку тулчейн собирает код руководствуясь правилами описываемой стандартом абстрактной машины, а там есть полноценная объектная модель.
ничего не должно стереться, просто его может использовать кто-то другой https://godbolt.org/z/d6Gdj94c5
return new int(50); тоже UB?
RVO здесь не играет роли: объект создается динамически (его время жизни не контролируется областью видимости выражения создания).
С чего бы?
Просто подумал что в некоторых кейсах RVO могло бы убить UB или ошибку компиляции , и автоматом под теорию в своей голове подогнал вопрос :)
видимо, мне основы по плюсам придется перечитать
Мыслить сырой памятью не стоит, но изучать С++ стоит с С, мне кажется. По крайней мере, разрывов шаблона (который не template) будет меньше, чем если начинать с лайфтаймов объектов, а потом прийти к тому, что, оказывается, есть байты, регистры и фон неймовская архитектура памяти.
Курс обучения предлагать я, пожалуй, не решусь, но Вы уверенны, что не смешиваете сейчас обучение C++ и обучение как минимум программированию?
Смешиваю. Но есть другие варианты? Встречал микроконтроллерный бэкграунд, но там поэтапно с C++98 до 14 был успех и каких-то фундаментальных проблем с пониманием концепций ЯП не было. Те, кто из питонов/джавоскриптов пришли ради быстрых библиотек через ffi, решили остаться в С или расте (или другом компилируемом яп, который им понравился).
Тех, кто целенаправленно учит кресты, умея другой яп хотя бы на уровне мидла (человека, способного решать обычные задачи без постороннего контроля) я не встречал.
Не могу сказать: у меня нет педагогического опыта.
Обсуждают сегодня