c++局部变量释放,还可以拿到地址的值

局部变量释放,但是仍然能拿到值
vector vvData;
{
int    a= 10;
int    b= 20;
int    c = 30;
int* p1 = &a;
int* p2 = &b;
int* p3 = &c;
vvData.push_back(p1);
vvData.push_back(p2);
vvData.push_back(p3);
int y;
}
for (int i=0; i< vvData.size(); i++)
{
    cout<[i]<<":"<<*vvData[i]<
把这一段代码用函数封装起来,返回出来的时候,就拿不到值,但是这种写法就能拿到值,按道理局部变量再括号外就释放掉了,为什么还能拿到值

栈中的变量通常包括函数参数和函数里声明的临时变量。
栈中的基本变量退出其作用域时,没有谁执行一段代码去释放/销毁/析构它所占用的内存,仅仅是没人再去理会的留在当前栈顶上方的若干遗留下来可被后续压栈操作覆盖的无用数据而已。
而栈中的类变量退出其作用域时,会自动执行其析构函数,……
所谓在栈中“申请”N字节的空间,其实只是将栈指针寄存器(16位sp,32位esp,64位rsp)的值多减N而已。

其实电脑开机后物理内存的每个字节中都有值且都是可读写的,从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页,一页通常为4KB。

可能内存还没有被操作系统分配给其它系统,因此数据还没有被擦除

1.vector<int*> vvData; 定义在括号外,可以看作不是局部变量
2.你这是相当于把p1 p2 p3的值写进了vvData数组中
3.有地址就可以使用星号难道该地址下的值,和p1 p2 p3没关系了,因为p1 p2 p3脱离局部已经没有该变量了,但vvData数组中存储的值是确确实实存在的,所以你可以用vvData[i]拿到值,在用*p1就会报错