调用方法时访问冲突异常

Ton*_*ony 5 c++ access-violation

我这里有一个奇怪的问题.假设我有一个带有一些方法的类.在某种情况下,此类的实例应调用其中一种方法.大多数情况下,该阶段没有问题,但有时会发现无法调用虚方法,因为指向该方法的指针为NULL(如VS所示),因此发生内存访问冲突异常.怎么会发生这种情况?

应用程序非常庞大和复杂,所以我真的不知道低级步骤会导致这种情况.发布原始代码不会有用.

UPD:好的,我看到我对这个问题的介绍是不确定的,所以示意代码看起来像

void MyClass::FirstMethod() const { /* Do stuff */ }
void MyClass::SecondMethod() const
{
    // This is where exception occurs, 
    // description of this method during runtime in VS looks like 0x000000
    FirstMethod(); 
}
Run Code Online (Sandbox Code Playgroud)

没有涉及构造函数或析构函数.

Han*_*ant 5

堆腐败可能是候选人.对象中的v表指针易受攻击,它通常是对象中的第一个字段.对于碰巧与对象相邻的某种其他对象的缓冲区溢出将擦除v表指针.通常很久以后,对虚拟方法的调用将会受到打击.

另一个经典案例是有一个坏的"this"指针,通常是NULL或低值.当您调用方法的对象引用不好时,就会发生这种情况.该方法将照常运行,但一旦尝试访问类成员就会爆炸.再次,堆损坏或使用已删除的指针将导致此问题.祝你好好调试一下; 这绝非易事.

  • 是的,堆损坏就是这样.v-table指针被破坏的可能性要小得多,调试分配器往往会在块周围放置防护.VS有<crtdbg.h>来帮助您找到这些问题. (2认同)