[問題] 非動態記憶體配置的問題

看板C_and_CPP (C/C++)作者 (B'z)時間16年前 (2009/10/25 00:58), 編輯推噓2(209)
留言11則, 4人參與, 最新討論串1/1
(使用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

10/25 01:17, , 1F
你delete ptr以後會出現什麼都不意外阿...
10/25 01:17, 1F

10/25 01:20, , 2F
怎麼能把auto variable 拿去delete呢?
10/25 01:20, 2F

10/25 01:26, , 3F
只有 new 出來的空間 才能delete
10/25 01:26, 3F

10/25 01:30, , 4F
第二次執行ptr->show();能有「像樣的東西」顯示出來
10/25 01:30, 4F

10/25 01:31, , 5F
那只是一時的僥倖而已 同樣的code在我的機器跑就是
10/25 01:31, 5F

10/25 01:32, , 6F
segmentation fault
10/25 01:32, 6F

10/25 01:38, , 7F
應該說是到delete ptr就掛了
10/25 01:38, 7F

10/25 01:44, , 8F
delete非new的記憶體 會不會是undefined behavior呢?
10/25 01:44, 8F

10/25 02:31, , 9F
才不是沒作用咧 ...
10/25 02:31, 9F

10/25 02:32, , 10F
你換個 compiler 就會吃到 violation 了
10/25 02:32, 10F

10/25 11:39, , 11F
感謝d大
10/25 11:39, 11F
文章代碼(AID): #1Aup95ls (C_and_CPP)
文章代碼(AID): #1Aup95ls (C_and_CPP)