作者aecho (星空下的鮪魚)
看板C_and_CPP
標題[問題] 今天遇到的一個問題~~
時間Mon Apr 13 16:33:17 2009
我做了一個 super class叫做 class A
其中A1 和A2 都是他的sub class
而其中有個 function void foo() 在 class A中是宣告成
virtual void foo () = 0; 也就是pure virtual function
在A1和A2實作了這個 virtual void foo()
接著就是讓程式一直亂跑,瘋狂的new 和delete …
然後出現了一個錯誤訊息…
大意就是 foo() 是個 pure virtual funcion,不能執行,所以發生錯誤。
可是從頭到尾都是new A1或是A2,因為 A裡面有pure virtual function的關係
new出來也不能用。除了在管理記憶體時用了A的指標來管理多型的物件。
想問的是,什麼原因造成這樣的結果?
我能想到的是存取了不明的記憶體…但個人覺得這個可能性還蠻小的。
因為如果存取到不明的記憶體的話,不可能會進入foo這個function,
應該更早之前就爛了,而且發生segmentation fault之類的訊息
在管理記憶體上是用了map<UINT64, A*>
所以…這跟STL不適合存指標有關係嗎?
--
「當我真心追尋著我的夢想時,每一天都是繽紛的。
因為我知道每一個小時都是在實現夢想的一部分,
當我真實地在追尋著時,一路上我都會發現從未想像過的東西,
如果當初我沒有勇氣去嘗試看來幾乎不可能的事,如今我就還只是個牧羊人而已。」
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.120.59.242
推 QQ29:然我不懂這麼高深的東西但我想問 class中含有pure virtual 04/13 16:40
→ QQ29:可以new東西嘛? 04/13 16:41
→ QQ29:我好想搞錯了@@ 抱歉 04/13 16:47
推 LiloHuang:用gdb或者vc++來偵測一下stack frame吧 看是怎樣爆 04/13 17:35
→ LiloHuang:STL沒有不適合存指標這回事...反而是存實體才要注意 04/13 17:35
→ LiloHuang:是否有自己實做deep copy的部份 存指標是很正常的阿 04/13 17:35
推 sunneo:會不會是因為在建構子或者解構子叫用而發生的錯誤 ? 04/13 17:51
→ sunneo:也許那部份還沒完成 所以仍然是pure virtual的狀態 04/13 17:51
推 legnaleurc:不建議容器存指標的原因是在伸縮容器時很容易失去指標 04/13 19:16
→ legnaleurc:真正"不適合"放容器的是像auto_ptr這種 04/13 19:17
→ legnaleurc:沒有 copy 語意的物件 04/13 19:17
→ aecho:謝謝大家的意見 我大概知道哪邊出問題了~~ 感謝~~ 04/13 21:56
→ aecho:想一想覺得應該像s大說的,解構子叫用的錯誤吧~~ 04/13 22:31
→ aecho:一個thread在解構,而另外一個thread呼叫了foo() Orz 04/13 22:32