[求助]关于析构函数和段错误的一点麻烦

xdark 2007-03-03 09:32:29
在学习C++得过程中,朋友遇到了这样的问题,代码如下
class person{
public:
int *age;
person()
{
*age=100;
}
// ~person(){
// cout<<"The ~person "<<endl;
// }
int getage(){
return *age;
}

};
int main(){
person s;
cout<<s.getage()<<endl;
return 0;
}

在没有自己写虚构函数的时候,系统运行结构为
100
段错误
其中,段错误的出现是很明显的,但是问题主要不在这里,主要是在重写虚构函数后,也就是把注释去掉后,段错误就没有了,可以正常运行,为什么重写后就没有了呢?

不要管这个例子有没有道理,希望有人能从段错误与析构函数的机理上给出合理的回答,谢谢。。
...全文
578 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
西北小生 2007-03-03
  • 打赏
  • 举报
回复
LZ的代码在vc++中可以通过编译,但运行是错误。
int *a;只是定义了一个指向INT的指针变量,他没有实际的地址空间,*a=100,在这时在我看来是错误的,如果改为a=new int; *a=100;则不管你有没有写析构函数都可以,当然如果我们在类中使用了指针变量,一般会重载复制构造函数,析构函数以及操作符=,否则在内存使用中会出现错误。

请多指教!
houdy 2007-03-03
  • 打赏
  • 举报
回复
我觉得问题不在于是否写了析构函数,析构函数只是一个"表象"。
最本质的问题在于age指针没有初始化,所以它可以是任何随机值,这就导致行为是不确定的,或者说可能是不可重现的。
如果LZ真要"刨根问底"的话,LZ可是试试这样:在两种情况下分别获得age指针的指,比较它们是否有很大的差别。这样的试验可以多做几次,比较一下是否每次它们的值都是一样的。
操作受保护的内存当然会引起内存错误。
xdark 2007-03-03
  • 打赏
  • 举报
回复
程序编译环境:
RedHat 9.0
编译器
g++
呵呵,不要从使用的合理性来解释,本人亲自编译调试过,编译也是可以通过的,问题不在于是否使用指针,那个段错误是存在的,现在的问题是为什么自己写个析构函数,那个段错误就没有了。。。不过还是谢谢你
believefym 2007-03-03
  • 打赏
  • 举报
回复
而且你这个例子,age没必要用指针,直接一个int不就可以了?
believefym 2007-03-03
  • 打赏
  • 举报
回复
楼主用什么编译器
你的age都没new就能用?编译能通过?
xdark 2007-03-03
  • 打赏
  • 举报
回复
补充一下,在重写析构函数后,得到的结果为:
100

65,202

社区成员

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

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