Переменная f
исчезла, но ее значение было сохранено в int
, на который указывает указатель, возвращаемый fun
. Код можно упростить до
#include <iostream>
int * tun() {
static int* ptr = new int;
int f = 111;
*ptr = f; // copy value of f
return ptr;
} // f is gone now, but who cares?
int main() {
std::cout << (*tun()) << std::endl;
}
Непонятно, что код должен делать, кроме обфускации, кстати.
tun () возвращает указатель, указывающий на адрес памяти f, когда tun больше не находится в стеке, разве память не была уничтожена?
Нет. В вашем коде нет указателя на f
. Эта строка
*(fun()) = f;
присваивает значение из f
переменной int
, на которую указывает stati c указатель ptr
, возвращаемый fun()
.
Это похоже на
int x = 0;
int* ptr = new int;
*ptr = x; // assigns 0 to the int pointed to by ptr
std::cout << *ptr; // prints 0
assert( ptr != &x); // adress of x ist not ptr !!!