我正在调试一个奇怪的问题,其中一个对象VMT突然似乎指向了基础对象的方法。
class Base
{
virtual void foo() {}
}
class Derived: public Base
{
void foo() {}
}
Derived * d = new Derived;
... much complex fettling ...
d->foo(); // Help! called Base::foo()!!!
它转变为“复杂”代码中的错误实际上正在delete d;
。除了说boost::noncopyable
是你的朋友之外,我不会详细介绍,并且在任何情况下都不会滚动你自己的智能指针类。
但是,我的问题是这个 - 这种对VMT的改变是一个很好的'气味',你正在处理一个被删除的对象?我想在破坏期间VMT会被“展开”回到Base
吗?
显然这是非常可靠的依赖,我很幸运,记忆没有被践踏......
答案 0 :(得分:4)
不确定问题是什么 - 但我会这样说:
我很幸运,记忆没有被践踏......
错了:你不幸运 - 你 un 幸运。如果在删除过程中内存被踩踏,你可能会让代码崩溃得更接近实际问题而且错误会更加清晰。
失败的代码应该尽早失败,以便提供有关失败位置的提示。
答案 1 :(得分:1)
我只能说g ++,你观察到的vtable改变其实就是发生了什么。您有时可以使用它来确定指针的对象已被删除,但这通常没有多大帮助,因为删除可能发生在多个地方。 shared_ptr
和unique_ptr
是管理记忆的朋友。
答案 2 :(得分:0)
你很幸运,你得到了基类行为而不是段错误。
如果您正在查找已删除的对象,则行为未定义。