C++-指针内存问题(待解决)

gyros 2019-03-09 11:33:29
https://blog.csdn.net/qq_41620518/article/details/88363614

在调试代码时遇到如下问题

1、单步调试,在运行第6行delete之前的输出为:


int main()
{
int *a =new int (1000);
cout << a << endl;
cout << sizeof(a) << endl;
delete a;
cout << sizeof(a) << " " << a << endl;
a = NULL;
cout << sizeof(a) << " " << a << endl;
return 0;
}


1、查看a地址对应的内存为:(int占4位字节,即7c08-7c0B:00-00-03-e8)(指针占4位字节,即fd-fd-fd-fd,指针为什么是fd-fd-fd-fd)




2、运行delete a后,内存查看如下:(为啥好些内存都变为了dd-dd-dd……)


3、此后的输出为,也证明了delete a后指针并不会销毁,还需要将a赋值NULL,防止a变为野指针。
但为什么a指向的地址会变,不是应该不变的吗?

...全文
287 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
老葱1# 2019-03-10
  • 打赏
  • 举报
回复
debug 版, 把一些原本的随机值,编译成赋予特殊值,比如 0xdcdcdcdc , 删除后,也会符特殊值,表示该内存无效 或 未初始化。
老葱1# 2019-03-10
  • 打赏
  • 举报
回复
你理解的没错, release 版, a 的指向不会变。 在 VC ,debug版,编译器会对未赋值的变量(或者内存空间), 给一个特殊值, , 便于发现问题, 这里的 delete 后, a 指向一个特殊地址, 也一样道理。
赵4老师 2019-03-09
  • 打赏
  • 举报
回复
理解讨论之前请先学会如何观察! 计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程! 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步Debug版对应汇编一行! 单步Debug版对应汇编千行不如单步Release版对应汇编一行! 不会单步Release版对应汇编?在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有,然后在IDE中运行。(一般人我不告诉他!) VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
一见 2019-03-09
  • 打赏
  • 举报
回复
第一点没有问题,1000的十六进制为0x03e8,后面的和编译器有关,你这个是vc吧,估计还是debug模式,不过一般编译器并不会去改变地址,具体原因不清楚,一个猜测是这样更容易让错误提前被发现。

64,636

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧