我有一个子类,其中包含一系列在其父类中实现纯虚函数的函数。
调试时,一切都按照它应该的方式工作,除了一个函数。
当我尝试进入functionA()时,执行代替进入functionB(),调用堆栈说我实际上是在functionC()中。
functionA()可以在我从这个父类继承的其他地方工作。
更改函数名称不执行任何操作,清理/重建不执行任何操作。我通过在函数中添加一个伪参数来实现它,但我宁愿一个真正的解决方案。
答案 0 :(得分:1)
听起来你有堆栈损坏,可能会混淆调试器,破坏你的程序,或两者兼而有之。
检查在数组中写得太多的东西,不安全地写入指针,写入未分配的内存等等。各种工具(如ValGrind)可能有所帮助。
因为您认为自己正在呼叫A
,但最终只有B
,而调试人员说您在C
,则需要一些 HARD 关于哪个函数实际被调用的证据。 因为我们怀疑调试器可能会混淆,所以它不算是一个可靠的来源。我建议使用一些日志工具(printf
会做得很好)来清楚地证明哪个函数实际上正在调用。
因为你说functionA
在其他地方被调用时有效,所以我首先会怀疑在事情发生之前调用functionA
的函数。该函数(我将其称为functionZ
)可以可靠地调用其他类似的函数吗?或者它们都表明堆栈损坏?调试functionZ
(及其上方的Y
和X
)仔细查找我所描述的问题。
答案 1 :(得分:1)
原来,作者在初始化过程中做了一些非常聪明的事情,编译器在调用方法调用时还没有设置派生类vtable。
找到它是一只熊。
您可能需要仔细查看vtable指针和生成的汇编语言,以确切了解初始化过程中的位置。
或者,对象中的vtable指针可能已被另一个对象的外部副本覆盖。