[英]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_ptr
和unique_ptr
是您管理内存的朋友。
您很幸运,得到了基类的行为,而不是段错误。
如果您要删除的对象,则行为是不确定的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.