作者bzgibson (B'z)
看板C_and_CPP
标题[问题] 非动态记忆体配置的问题
时间Sun Oct 25 00:58:43 2009
(使用dev c++)
class Cfather
{
protected:
int number;
char id;
public:
Cwin(int n=1,char i='A'):number(n),id(i)
{}
void show(void)
{
cout << " id = " << id << endl;
cout << "a() = " << a() << endl;
}
virtual int a()
{
return number;
}
};
class Child : public Cfather
{
private:
char i;
public:
Child(char ii='C'):i(ii)
{}
virtual int a()
{
return number+100;
}
};
int main()
{
Cfather *ptr; //我先宣告指向父类别的指标ptr
Child abc;
ptr=&abc; //再指向子类别
ptr->show(); //目前功能正常 a()=101,id=A
delete ptr; //故意删除
ptr->show(); //执行结果 a()=1异常,不是要等於101吗?,id=A正常
}
问题如下:
我知道abc这个物件不是使用动态记忆体配置,所以delete ptr 根本没作用,
但我想再去观察abc,所以再执行一次ptr->show()时,
我发现继承而来的id功能正常,
可是a()却出问题,
似乎子类别的a()无法正常改写,
请问此问题出在哪个地方~谢谢指教。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 123.192.217.32
1F:→ dendrobium:你delete ptr以後会出现什麽都不意外阿... 10/25 01:17
2F:推 dendrobium:怎麽能把auto variable 拿去delete呢? 10/25 01:20
3F:→ dendrobium:只有 new 出来的空间 才能delete 10/25 01:26
4F:→ dendrobium:第二次执行ptr->show();能有「像样的东西」显示出来 10/25 01:30
5F:→ dendrobium:那只是一时的侥幸而已 同样的code在我的机器跑就是 10/25 01:31
6F:→ dendrobium:segmentation fault 10/25 01:32
7F:→ dendrobium:应该说是到delete ptr就挂了 10/25 01:38
8F:→ james732:delete非new的记忆体 会不会是undefined behavior呢? 10/25 01:44
9F:推 legnaleurc:才不是没作用咧 ... 10/25 02:31
10F:→ legnaleurc:你换个 compiler 就会吃到 violation 了 10/25 02:32
11F:→ bzgibson:感谢d大 10/25 11:39