delete释放后的指针为什么还可以用

aszxqw 2010-04-26 12:55:13
#include<iostream>
using namespace std;
void main()
{char*ch1,*ch2;
ch1=new char('h');
delete ch1;
*ch1='a';
cout<<*ch1;
}
这样输出的结果是 a。
为什么 *ch1='a’;这语句还可以运行呢。ch1指向的堆空间已经被释放了啊不是吗。
这时候a是存在哪里呢,是存在已经释放的堆里?
...全文
1621 23 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
suncuigang 2012-12-04
  • 打赏
  • 举报
回复
引用 6 楼 dfpgb 的回复:
晕...
晕毛啊
jsdwangbing 2010-09-03
  • 打赏
  • 举报
回复
zhao4zhongl小红星的这个人确实牛逼啊
dong329937021 2010-07-25
  • 打赏
  • 举报
回复
#include<iostream>
using namespace std;
void main()
{char*ch1;
ch1=new char('h');
delete ch1;// 只是释放对象的内存空间
*ch1='a';//这里又初始化对象,分配内存
cout<<*ch1<<endl;
}

delete是把上面的内存空间释放了,也就是告诉系统,这块内存可以被分配给其他人(因为你既然释放内存了,那系统肯定认为你不需要这块内存了),如果有其他人new后得到这块内存,那肯定会被分配给这个人,但是ch1指针仍然指向这块内存(如果你不做ch1=0的话),也可以对其进行任何操作,如果这块内存已经被分配给别人了,那你这时候通过ch1对其进行的操作可能会导致难以预料的严重后果,所以ch1=0很重要。而对于*ch1='a';需要说明,ch1是放在栈上的,而字符‘a’也是在栈上,只是这时候ch1指向了‘a‘在栈上的地址,所以cout<<*ch1<<endl;肯定是输出a。下面是我自己的一段测试程序
#include <iostream>
#include <stdio.h>
using namespace std;
int main(void) {
char* ch1 = new char[50];
cout << &ch1 << endl;
for (int k = 0; k < 50; k++) {
ch1[k] = '1';
}
for (int k = 0; k < 50; k++) {
cout << ch1[0] << ", ";
}
cout << endl;
printf("%0X", ch1);
cout << endl;
delete ch1;//
char* ch2 = new char[1000];
for (int k = 0; k < 1000; k++) {
ch2[k] = 'q';
}
for (int k = 0; k < 10; k++) {
ch1[k] = '2';
}
printf("%0X", ch2);
cout << endl;
for (int k = 0; k < 50; k++) {
cout << ch1[k] << ", ";
}

return 0;
}
大家把 delete ch1;注释掉后观察一下运行结果,主要是 printf("%0X", ch1);和 printf("%0X", ch2);有什么不一样的地方。
aszxqw 2010-05-01
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 beyond_cn 的回复:]
可以用但很危险。。
[/Quote]
危险到什么程度,可以让系统瘫痪吗?那我岂不是可以用这个程序去瘫痪下铺那个傻逼的电脑?
尹成 2010-04-28
  • 打赏
  • 举报
回复
char*ch1,*ch2;
ch1=new char('h');
delete ch1;

delete的时候,系统只是将指针指向的堆空间回收,但是没有将指针变量
的值赋值为null,也就是说指针还是指向原来的堆空间,但是这个空间已经失效
所以delete一个指针以后要马上将它赋值为null
不然容易导致野指针的出现
Beyond_cn 2010-04-28
  • 打赏
  • 举报
回复
可以用但很危险。。
Michael_Xie 2010-04-28
  • 打赏
  • 举报
回复
不安全的做法,以后别这样了!
pengzhixi 2010-04-26
  • 打赏
  • 举报
回复
LZ打算靠人品吃饭?
pywepe 2010-04-26
  • 打赏
  • 举报
回复
程序结束时会不会报错呢?
only_delusion 2010-04-26
  • 打赏
  • 举报
回复
基本就是和3楼说的差不多了

delete之后释放指针指向的空间内存 一般时候是堆内存

但是内存释放 指针并不销毁

只是指向其他内存,如果此时给它赋值,重则摧毁系统,轻则程序无响应,人品好点的就是能输出结果 系统还没呗破坏

一般delete之后就要赋值NULL,要不就不要用了

但是也可以用 ch1=&变量 在此初始化一次
liutengfeigo 2010-04-26
  • 打赏
  • 举报
回复
delete和free函数一样,不修改它参数对应指针指向的内容,也不修改指针本身,只是在堆内存管理结构中将指针指向的内容标记为可被重新分配。
学习了,感谢小红星。
赵4老师 2010-04-26
  • 打赏
  • 举报
回复
delete和free函数一样,不修改它参数对应指针指向的内容,也不修改指针本身,只是在堆内存管理结构中将指针指向的内容标记为可被重新分配。
如果不考虑多任务或多线程的影响(即紧跟在delete或free后不会发生其它任务或线程调用new或malloc之类的在堆上分配内存的函数),这个写法是可以的。
当然最好还是不要这样写。
sinosinux 2010-04-26
  • 打赏
  • 举报
回复
delete是告诉编译器,这块内存你可以收回去了,将来可能会被编译器分配给别人使用
cattycat 2010-04-26
  • 打赏
  • 举报
回复
虽然你释放了,但你的指针没置NULL,你往里边写东西,仍然是写在堆里的,但不保证下次new个东西,被别人覆盖了。
itxuls 2010-04-26
  • 打赏
  • 举报
回复
我觉得不是

#include<iostream>
using namespace std;
void main()
{char*ch1;
ch1=new char('h');
delete ch1;// 只是释放对象的内存空间
*ch1='a';//这里又初始化对象,分配内存
cout<<*ch1<<endl;
}


不知道对不?
  • 打赏
  • 举报
回复
[Quote=引用楼主 wuyanyi 的回复:]
#include<iostream>
using namespace std;
void main()
{char*ch1,*ch2;
ch1=new char('h');
delete ch1;
*ch1='a';
cout<<*ch1;
}
这样输出的结果是 a。
为什么 *ch1='a’;这语句还可以运行呢。ch1指向的堆空间已经被释放了啊不是吗。
这时候a是存在哪里呢……
[/Quote]

楼主,我再告诉你一个秘密,其实你不new或者malloc,也可以使用堆里的内存哦。。
嘘,别告诉别人,与个人偷偷用就好了。
acrobatyuer 2010-04-26
  • 打赏
  • 举报
回复
都正解了,记住delete后一定要将指针置为空啊!
yang6zhen8 2010-04-26
  • 打赏
  • 举报
回复
你可以做个试验,就知道了,ch1=new char('h')后,你把ch1地址打印出来,你重写main函数,直接用这个地址赋值给ch1,这时*ch1='a';还是可以的。 这样你应该明白了
yang6zhen8 2010-04-26
  • 打赏
  • 举报
回复
用delete ch1是可以把ch1指向的堆空间释放,但ch1指向的堆空间还是存在的(内存空间始终存在的,只是你程序用不到这段内存),也就是说这一快内存没有被你这段程序运用,当你再new的时候,有可能还会申请到这块内存,所以如再调用这段内存可能会发生不可预知的情况,所以一般delete之后就把指针设为NULL。
dfpgb 2010-04-26
  • 打赏
  • 举报
回复
晕...
加载更多回复(3)

65,186

社区成员

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

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