作者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