C++ 虚拟呼叫崩溃

C++ 虚拟呼叫崩溃,c++,function,pointers,crash,C++,Function,Pointers,Crash,下一次迭代(下一次游戏循环更新),调用相同的适配器update()。输出: class AbstractEffect{ public: AbstractEffect() : _id(AbstractEffect::generateID()){} virtual void update() const{ LOG("Base class Update"); } void nonVirtualCall() const{ LOG("Test cal

下一次迭代(下一次游戏循环更新),调用相同的适配器update()。输出:

class AbstractEffect{
public:
   AbstractEffect() : _id(AbstractEffect::generateID()){}

   virtual void update() const{
       LOG("Base class Update");
   }

   void nonVirtualCall() const{
       LOG("Test call");
   }


   private:
   const int _id;

   static int generateID(){ static int id= 0; return id++; }
}

class EffectImpl : public AbstractEffect{
public:
    EffectImpl(){}

    virtual void update() const{
         LOG("Impl update");
    } 
}

class Adapter{
public:
      Adapter(const AbstractEffect* effect) : _effect(effect) { }

void update(){
     LOG("This " << this);
     LOG("Effect address " << _effect);
     _effect->nonVirtualCall(); // dummy call I made to see what happens
     _effect->update(); // virtual function call
}

private:
    const AbstractEffect* const _effect; 
}
This 04155D90
Effect address 006F4A58
Test Call
Impl update
。。。在那里,它在更新虚拟调用时崩溃(访问冲突)。正如您所看到的,它是相同的适配器类,但效果不同,尽管我已将其定义为const*。我在两个调用中都检查了对象的属性值。在第一种情况下,id是0(应该是),在第二种情况下,它是一个八位数的数字(例如68509216)。我在effect的析构函数上设置了一个断点,以确保对象没有被破坏


const AbstractEffect*const如何指向不同的对象?它如何在虚拟调用中崩溃并成功执行非虚拟调用?

看起来您的内存出现了某种损坏。或者,这些不是实际上相同的对象,而是发生在同一位置上的临时值(例如,因为它们在堆栈上,并在同一堆栈槽中结束,因为每次都是相同的调用链)。您可能会考虑适配器的析构函数上的断点……在临时情况下,函数一返回,就会调用它的析构函数。关于适配器,它的析构函数没有被调用。如果是的话,它会在适配器的update()调用时崩溃,而不会生效,因为我会尝试在悬空指针上调用update。无论如何,因为您的
AbstractEffect*
没有指向正确的位置,您的非virt方法调用成功,因为它不需要virt表进行分派,而且所涉及的方法实际上并不查看此。(如果它确实查看了
这个
,它会感到震惊。)virt方法崩溃,因为指针无效,因此virt表查找会导致访问冲突。(通常virt表隐藏在类结构的第一个字节中。)
This 04155D90
Effect address 0020F65C
Test Call