一个奇怪的问题,请大家看一看,谢谢了

wftree 2002-11-19 10:18:36
#include <iostream.h>
class ca
{public:
ca(){cout<<endl<<"bulid a";}
~ca(){cout<<endl<<"destroy a";}
virtual ok()
{
cout<<endl<<"I still living !";
int ss=33;
}
};
ca *test()
{
ca *p=new ca;
return p;
}
void main()
{
ca *ss=test();
delete ss;
ss->ok();
}


ss为什么还是可以运行了?他指向的那一个内存不是已经放弃了吗?
...全文
60 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
liushmh 2002-11-19
  • 打赏
  • 举报
回复
就是因为有的编译器可以编译通过,而且在一段时间可以运行正确,这样就可能在一段时间内隐藏了错误,这非常不利于程序的正确性,所以林锐才强调要在delete后将指针赋予NULL。
wftree 2002-11-19
  • 打赏
  • 举报
回复
我也是看了林锐的高质量编程以后,试了一试。用的TC3结果可以运行,所以很奇怪,看来和编译器有关系,
yahaha 2002-11-19
  • 打赏
  • 举报
回复
一般在C++中要删去一个动态分配的内存的指针在delete后要给指针赋一个0值,delete只是表示,指针不指向你动态分配的内存,而是释放你的指针所指的内存,你的指针此时还存在,因为指针不是动态分配的,你不能控制它的消亡,只有在程序结束时,才由编译器销毁。所以delete后的指针是存在的,但是指的东东是无法控制的。
zxm954712 2002-11-19
  • 打赏
  • 举报
回复
我在vc下试过了,第一个ss是可以运行的,因为它指向一块堆上的内存,而在delete ss之后,堆上的内存释放了,ss->ok()就不能执行了,
bugfree 2002-11-19
  • 打赏
  • 举报
回复
One error in g++: it does not allow virtual there is no type and return value.
modify as below:
8 virtual int ok()
9 {
10 cout<<endl<<"I still living !";
11 int ss=33;
12 return 0;
13 }
14 };


It does not fire error is bacause the ss vaule is not changed, the delete only free the the momory it point to...

So if there memory which the ss point to is not override, the ss->ok() will work.
liushmh 2002-11-19
  • 打赏
  • 举报
回复
释放归释放,但是ss的地址值并没有改变,还是原来的地址,可以说是出现了野指针,所以在释放后要注意在后面加上ss = NULL;这点,林锐的高质量c++程序设计讲的很清楚了。
vanhui 2002-11-19
  • 打赏
  • 举报
回复
VC6.0里面只能通过编译,不能正常运行呀,错误显示为内存不能为“READ”,因为SS指向一个未知内存地址,
rtdb 2002-11-19
  • 打赏
  • 举报
回复
你放弃不放弃, 程序是不管的.
它只按定好的步骤跑.

类似的内存问题是学习C++ 的重点.

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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