一定会找到好的工作 2022-08-18 11:03 采纳率: 66.7%
浏览 30
已结题

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

局部变量释放,但是仍然能拿到值
vector<int*> 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<<vvData[i]<<":"<<*vvData[i]<<endl;
}
把这一段代码用函数封装起来,返回出来的时候,就拿不到值,但是这种写法就能拿到值,按道理局部变量再括号外就释放掉了,为什么还能拿到值
  • 写回答

3条回答 默认 最新

  • 赵4老师 2022-08-18 13:30
    关注

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

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 8月27日
  • 已采纳回答 8月19日
  • 创建了问题 8月18日

悬赏问题

  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 unity第一人称射击小游戏,有demo,在原脚本的基础上进行修改以达到要求
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line