C ++调试“气味”

时间:2011-03-28 11:34:17

标签: c++ debugging destructor virtual-method

我正在调试一个奇怪的问题,其中一个对象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吗?

显然这是非常可靠的依赖,我很幸运,记忆没有被践踏......

3 个答案:

答案 0 :(得分:4)

不确定问题是什么 - 但我会这样说:

  

我很幸运,记忆没有被践踏......

错了:你不幸运 - 你 un 幸运。如果在删除过程中内存被踩踏,你可能会让代码崩溃得更接近实际问题而且错误会更加清晰。

失败的代码应该尽早失败,以便提供有关失败位置的提示。

答案 1 :(得分:1)

我只能说g ++,你观察到的vtable改变其实就是发生了什么。您有时可以使用它来确定指针的对象已被删除,但这通常没有多大帮助,因为删除可能发生在多个地方。 shared_ptrunique_ptr是管理记忆的朋友。

答案 2 :(得分:0)

你很幸运,你得到了基类行为而不是段错误。

如果您正在查找已删除的对象,则行为未定义。