繁体   English   中英

C ++调试“气味”

[英]C++ Debugging “smell”

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

显然,这是依赖于可怕的实现,而且我很幸运,记忆没有被践踏……

不知道问题是什么-但我会这样说:

我很幸运,记忆没有被踩到...

是错的:您不走运–您走运。 如果在删除过程中内存被踩碎,您可能会使代码崩溃更接近实际问题,并且错误会更加清楚。

失败的代码应尽早失败,以提示有关失败位置的信息。

我只能代表g ++,您观察到的vtable更改实际上就是发生的情况。 有时您可以使用它来确定删除了指针的对象,但这通常无济于事,因为删除可能会发生在多个地方。 shared_ptrunique_ptr是您管理内存的朋友。

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

如果您要删除的对象,则行为是不确定的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM