delete指针测试

黎前点星 2016-02-21 05:27:25
加精

int *p;

p = new int;

*p = 3600;
cout << *p << endl;
cout << p << endl;
cout << &p << endl;

cout << "删除指针之后 \n";

delete p;
cout << *p << endl;
cout << p << endl;
cout << &p << endl;



的出来的结果为

3600
002A1BC0
0018FF44
删除指针之后
-572662307
002A1BC0
0018FF44

观察了定义指针后和删除指针后的区别
发现删除指针后,只是指针对应的内存地址中的值倍删除,但是指针的地址依然存在,那么说明指针并不是真正删除了,而是抽象中的删除,不知道我理解的对不对,大神指点一下!

...全文
1367 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
wf_it_life 2016-08-08
  • 打赏
  • 举报
回复
顶7楼
Glemontree_ 2016-07-05
  • 打赏
  • 举报
回复
delete的作用就是释放内存,所以不会删除指针,delete之后最好让p =null
7记 2016-02-28
  • 打赏
  • 举报
回复
学习,学习 支持,支持
Starmean 2016-02-26
  • 打赏
  • 举报
回复
delete p; 做两件事: 1.如果p是对象并有析构函数,则调用析构函数 2.将p指指向的内存释放,也就是在内存管理器中将该内存设置为空闲可用状态 注意: 1.它只是释放它所指向的内存,并没有修改它自己所存储的值,它本身也不会被删除或修改,这个指针本身的地址不变,依然有效。 2.它此时会成为野指针,也就是它指向的内存已经空闲可用,随时会在其它地方被使用,值将会不确定,使用易出错,通常在删除指针后会紧跟着一句 p = NULL; 防止误用 因此,楼主的程序无论运行多少次,只会有*p的值改变,也就是指向的内存内容改变,p的值和p的地址值不会改变
bagbagking 2016-02-25
  • 打赏
  • 举报
回复
学习了learning
oN5GrzoN 2016-02-24
  • 打赏
  • 举报
回复
引用 18 楼 henuyx 的回复:
话说: 王尼玛带着班花来到了酒店,开了一个超豪华总统套房,前台给了王尼玛一个房卡。(new 成功) 房间里传出来各种不和谐的声音。(指针指向的空间正在使用中。。。此处省略1万行代码) 退房时间到了,王尼玛在前台退了房。(delete 成功) 但是,王尼玛却没把房卡给前台,回到学校,拿着房卡对同学们炫耀说:你们看,房卡还在!!(指针还在。。。)
Heart09 2016-02-24
  • 打赏
  • 举报
回复
话说: 王尼玛带着班花来到了酒店,开了一个超豪华总统套房,前台给了王尼玛一个房卡。(new 成功) 房间里传出来各种不和谐的声音。(指针指向的空间正在使用中。。。此处省略1万行代码) 退房时间到了,王尼玛在前台退了房。(delete 成功) 但是,王尼玛却没把房卡给前台,回到学校,拿着房卡对同学们炫耀说:你们看,房卡还在!!(指针还在。。。)
fefe82 2016-02-24
  • 打赏
  • 举报
回复
引用 15 楼 cyfcsd 的回复:
行为是未定义的,但实际来说为什么删除后值马上就改变了啊?难道C++还特意产生一个随机数去覆盖那块儿内存吗?
如果是特意的,通常是为了调试目的,通常需要特别指明测试编译。(如 VS 的 BEBUG 方式编译。具体编译选项请参阅 MSDN) 如果没有调试需求,通常不会去刻意覆盖这些值。但这些值依然可能被一些你所没有想象到的操作所覆盖。 编译器不会保证任何没有明确需求的结果(比如"删除"之后的内存是否被覆盖,什么时候被覆盖,被覆盖成什么 ....)。 不要想象编译去会怎么做。想知道编译器吧代码处理成了什么样子,就只有自己去看编译的结果。 最后,“刻意去覆盖”的编译器其实也并没有错。编译器想干什么都可以,只要不影响有明确定义的行为(不包括未定义行为,比如你 delete 之后的 *p)。但是这样 delete 效率会下降,所以一般 release 的话不会这么干而已。
赵4老师 2016-02-24
  • 打赏
  • 举报
回复
为什么不在你想监测的内存字节处设置数据断点呢? To break when the value at a specified memory address changes From the Edit menu, click Breakpoints. Click the Data tab of the Breakpoints dialog box. In the Expression text box, type the memory address for the byte. For a word or doubleword memory address, enclose the address in parentheses, and precede it with a cast operator. For example, WO(21406036) for the word at memory location 21406036. Use the cast operator BY for a byte (optional), WO for a word, or DW for a doubleword. (The debugger interprets all integer constants as decimal unless they begin with zero (0) for octal or zero and x (0x) for hexadecimal.) In the Number Of Elements text box, type the number of bytes, words, or doublewords to monitor. If you used the BY operator in the Expression field, specify the number of bytes. If you used WO, specify the number of words. If you used DW, specify the number of doublewords. Click OK to set the breakpoint.
snowmagic 2016-02-24
  • 打赏
  • 举报
回复
引用 15 楼 cyfcsd 的回复:
行为是未定义的,但实际来说为什么删除后值马上就改变了啊?难道C++还特意产生一个随机数去覆盖那块儿内存吗?
未定义的意思是有可能还是原来的值,有可能被别的值覆盖,有可能不能访问了
fox狐狸 2016-02-24
  • 打赏
  • 举报
回复
一个是在栈上,一个是在堆上,delete只是把堆上的地址释放了,而栈上的空间是所属定义域结束后,编译器自动清理的。用new关键字是在堆上开辟的空间
Sidyhe 2016-02-24
  • 打赏
  • 举报
回复
wyx3010218151 2016-02-24
  • 打赏
  • 举报
回复
das asddas asdsad
赵4老师 2016-02-23
  • 打赏
  • 举报
回复
搜“说是一物即不中”
赵4老师 2016-02-23
  • 打赏
  • 举报
回复
引用 9 楼 snowmagic 的回复:
你说的没有一句是准确的并且和问题没关。。。 delete p只是释放p指向的对象的内存资源 p指针本身分配在栈上,出作用域的时候内存会释放 [quote=引用 7 楼 zhao4zhong1 的回复:] new、delete 对应 借、还; 不对应 创建、销毁! 其实电脑开机后物理内存的每个字节都是可读写的,从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页,一页通常为4KB。
[/quote] 搜“盲人摸太阳” 请你对盲人“准确的”解释“太阳”。
赵4老师 2016-02-23
  • 打赏
  • 举报
回复
理解讨论之前请先学会如何观察! 不要迷信书、考题、老师、回帖; 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实! 有人说一套做一套,你相信他说的还是相信他做的? 其实严格来说这个世界上古往今来所有人都是说一套做一套,不是吗? 计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程! 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步Debug版对应汇编一行! 单步Debug版对应汇编千行不如单步Release版对应汇编一行! 不会单步Release版对应汇编?在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有,然后在IDE中运行。(一般人我不告诉他!单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。 VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。 (Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。) 电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息…… 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。
flying_music 2016-02-23
  • 打赏
  • 举报
回复
行为是未定义的,但实际来说为什么删除后值马上就改变了啊?难道C++还特意产生一个随机数去覆盖那块儿内存吗?
snowmagic 2016-02-23
  • 打赏
  • 举报
回复
你说的没有一句是准确的并且和问题没关。。。 delete p只是释放p指向的对象的内存资源 p指针本身分配在栈上,出作用域的时候内存会释放
引用 7 楼 zhao4zhong1 的回复:
new、delete 对应 借、还; 不对应 创建、销毁! 其实电脑开机后物理内存的每个字节都是可读写的,从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页,一页通常为4KB。
lm_whales 2016-02-22
  • 打赏
  • 举报
回复
所谓内存分配,就是有一块(或者多块)地址的内存, 加载以后,并没有安排代码区,栈区,数据区这样的固定用途 而是可以自由支配的区域 但是这个自由支配,不是随便用 而是依赖 malloc,free 等库函数来管理使用 C++ 还包括 new delete ,new[] delete[] 这些运算符管理内存的分配,回收 分配就可说你可以使用不会给别的用途冲突 回收就是不再是可用的了,用了就可能跟内存管理起冲突了 冲突后,内存管理机制有可能被损坏,内存就难以分配了 至于用了没事,这不是问题,但不能保证一定没事。
赵4老师 2016-02-22
  • 打赏
  • 举报
回复
new、delete 对应 借、还; 不对应 创建、销毁! 其实电脑开机后物理内存的每个字节都是可读写的,从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页,一页通常为4KB。
加载更多回复(6)

64,642

社区成员

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

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