1

这家伙:

virtual phTreeClass* GetTreeClass() const { return (phTreeClass*)m_entity_class; }

调用时,即使在完全重新编译之后,程序也会因访问冲突而崩溃。所有成员函数和虚拟成员函数都有正确的内存地址(我将鼠标悬停在调试模式下的方法上),但是这个函数有一个错误的内存地址:0xfffffffc。

一切看起来都很好:'this' 指针,在这个函数调用之前一切正常。这个功能也比较老了,好久没改了。这个问题只是在一些工作后突然出现,我把它全部评论出来看看是什么做的,没有任何成功。

所以我去掉了虚拟的,编译好了,效果很好。我添加了虚拟的,编译的,它仍然可以正常工作!我基本上什么都没做,记得我之前确实做了完整的重新编译,但当时仍然有错误。

我无法重现该问题。但现在它又回来了。我没有改变任何东西。删除虚拟解决了这个问题。

4

3 回答 3

2

除非您非常确定自己在做什么,否则永远不要对多态类型使用 C 风格的强制转换。压倒性的可能性是您将其转换为不是的类型。如果您的指针没有隐式转换(因为它们转换为安全的基类),那么您做错了。

于 2010-06-14T15:06:40.597 回答
0

鉴于重新编译最初解决了问题,请尝试先进行完全清理并重新构建。

如果失败了,那么即使您的指this针对您来说似乎是正确的,它看起来也极有可能实际上已被删除/解构并指向恰好看起来像以前存在的真实对象的垃圾内存。如果您使用 gdb 进行调试,则对象指针处的第一个单词将是 vtable。如果您x/16xw <addr>在该位置执行(例如)内存转储,gdb 将告诉您哪种对象的 vtable 驻留在那里。如果它是最父类型,那么该对象肯定已经消失了。

或者,如果 this 指针每次都相同,您可以在类析构函数中放置一个断点,条件是this == known_addr.

于 2010-06-14T15:16:09.523 回答
0

编译器和链接器是人类编写的软件,与其他任何软件一样,因此本质上不可能没有错误。

我们偶尔也会遇到这种莫名其妙的问题和修复。这里有一个神话,一旦修复了构建,就删除 ncb 文件。

于 2010-06-14T14:52:08.207 回答