此人:

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

当调用时,碰撞了程序与访问冲突,甚至完全重新编译后。所有成员函数和虚拟成员函数有正确的存储器地址(I徘徊鼠标悬停在调试模式的方法),但这个函数有一个坏的存储器地址:0xfffffffc

一切看起来还行:在“这个”指针,一切工作正常,直到调用这个函数。此功能也很老,我并没有改变它的很长一段时间。问题只是突然杀出后的一些工作,这是我所有的评论出来看发生了什么这样做,没有任何成功。

所以我删除的虚拟,编译,并能正常工作。我添加虚拟的,编译,它仍然能正常工作!我基本上没有什么变化,记得我做一个完整的重新编译较早,并且仍然有错误当时的情况。

我无法重现该问题。但现在又回来了。我没有改变任何东西。去除虚拟修复该问题。

有帮助吗?

解决方案

千万不要使用C风格的类型转换与多态类型,除非你认真肯定你在做什么。压倒性的概率是你将它转换为一个类型,它不是。如果你的指针不隐式转换(因为他们投的基类,它是安全的),那么你就错了这样做。

其他提示

编译器和接头是由人类像任何其他写入的软件块,并因此本质上不能是无差错..

我们偶尔会碰上这样莫名其妙的问题和解决了。有一个神话,绕来绕去这里删除NCB文件一旦固定构建..

由于最初重新编译解决了这一问题,尝试做一个全面清理和重建首

如果失败,那么它看起来极有可能的是,即使你的this指针显示正确的给你,它实际上是删除/解构,并在此恰好看起来像真正的对象,之前在那里的垃圾指向的内存。如果你用gdb调试,在对象的指针的第一个字将是虚表。如果你做一个x/16xw <addr>(例如)在该位置GDB内存转储会告诉你某种对象的虚函数表驻留有什么。如果它的父 - 最型则该对象是绝对没有了。

或者如果这个指针isthe每一样你可以把一个断点类析构函数与条件时间this == known_addr

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top