作者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
1F:推 QQ29:然我不懂这麽高深的东西但我想问 class中含有pure virtual 04/13 16:40
2F:→ QQ29:可以new东西嘛? 04/13 16:41
3F:→ QQ29:我好想搞错了@@ 抱歉 04/13 16:47
4F:推 LiloHuang:用gdb或者vc++来侦测一下stack frame吧 看是怎样爆 04/13 17:35
5F:→ LiloHuang:STL没有不适合存指标这回事...反而是存实体才要注意 04/13 17:35
6F:→ LiloHuang:是否有自己实做deep copy的部份 存指标是很正常的阿 04/13 17:35
7F:推 sunneo:会不会是因为在建构子或者解构子叫用而发生的错误 ? 04/13 17:51
8F:→ sunneo:也许那部份还没完成 所以仍然是pure virtual的状态 04/13 17:51
9F:推 legnaleurc:不建议容器存指标的原因是在伸缩容器时很容易失去指标 04/13 19:16
10F:→ legnaleurc:真正"不适合"放容器的是像auto_ptr这种 04/13 19:17
11F:→ legnaleurc:没有 copy 语意的物件 04/13 19:17
12F:→ aecho:谢谢大家的意见 我大概知道哪边出问题了~~ 感谢~~ 04/13 21:56
13F:→ aecho:想一想觉得应该像s大说的,解构子叫用的错误吧~~ 04/13 22:31
14F:→ aecho:一个thread在解构,而另外一个thread呼叫了foo() Orz 04/13 22:32