delete指针测试

C++语言 码拜 8年前 (2016-04-03) 1275次浏览
	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
观察了定义指针后和删除指针后的区别
发现删除指针后,只是指针对应的内存地址中的值倍删除,但是指针的地址依然存在,那么说明指针并不是真正删除了,而是抽象中的删除,不知道本人理解的对不对,高手指点一下!

解决方案

2

删除的只是指针指向的内容!

2

按本人的理解, 内容也不一定被删除。
删除只是对系统宣布,这块地址本人放弃了,至于其之后的命运,要看造化了。

2

delete p以后,可以p=NULL使之为空。
&p表示p这个变量的内存编号(每个变量都有内存编号),p表示这个编号内存空间的内容(通常是某个变量例如i的地址,或动态分配的内存空间地址),*p表示i的值。
推荐一本书:
《深入理解C指针》

2

你动态申请的内存已经删除了,只是指针还指向着那个地址
通常好的习惯是写成:
delete p;
p = NULL;  //将指针指向NULL,防止使用已释放了的内存

2

你在北京路50号租了房子,住了一段时间后,向房东退租了房子离开了,那个房子依然在北京路50号,不会消失,只是不再属于你了,你不能再进去了

2

所谓内存分配,就是有一块(或多块)地址的内存,
加载以后,并没有安排代码区,栈区,数据区这样的固定用途
而是可以自由支配的区域
但是这个自由支配,不是随便用
而是依赖 malloc,free 等库函数来管理使用
C++ 还包括 new delete ,new[] delete[]
这些运算符管理内存的分配,回收
分配就可说你可以使用不会给别的用途冲突
回收就是不再是可用的了,用了就可能跟内存管理起冲突了
冲突后,内存管理机制有可能被损坏,内存就难以分配了
至于用了没事,这不是问题,但不能保证一定没事。

2

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

2

楼上的理解很好.+1.

2

你说的没有一句是准确的并且和问题没关。
delete p只是释放p指向的对象的内存资源
p指针本身分配在栈上,出作用域的时候内存会释放

引用:

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

2

delete指针测试理解讨论之前请先学会怎么样观察
不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!
有人说一套做一套,你相信他说的还是相信他做的?
其实严格来说这个世界上古往今来全部人都是说一套做一套,不是吗?
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……
对学习编程者的忠告:
delete指针测试多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程!
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步Debug版对应汇编一行!
单步Debug版对应汇编千行不如单步Release版对应汇编一行!
不会单步Release版对应汇编?在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建全部,然后在IDE中运行。(一般人本人不告诉他!delete指针测试
单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的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软件查看硬盘或文件或内存中的原始字节内容。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明delete指针测试
喜欢 (0)
[1034331897@qq.com]
分享 (0)