__vfptr表在未删除的对象中已损坏

时间:2016-08-12 09:34:06

标签: c++ inheritance visual-studio-2013

我有一个A类对象的问题,它继承了一个带有一些纯虚函数的基类B,并且我有一个ptr对象列表,我在那里添加了B类对象。问题是有时当我尝试从列表中的对象访问虚拟方法__vfptr表已损坏。列表中的对象没有被删除,我将用汽车拍摄一张照片。有没有人知道为什么会这样?事情是,如果我启动应用程序的一个或两个实例没有发生错误,但是当我启动更多实例时,它会在应用程序的第三个或第四个实例处给出访问冲突读取,这很奇怪。

或者你至少知道如何跟踪vftable的指针何时发生变化?因为该方法是从一堆地方调用的,我不可能用调试器跟踪所有这些,更不用说这个错误是随机发生的了。

非常感谢

enter image description here

更新1

示例:http://rextester.com/live/MRHR24728

//Microsoft (R) C/C++ Optimizing Compiler Version 19.00.23506 for x86

#include <iostream>
#include <stdint.h>

typedef struct
{
    uint8_t name;
}sName;

class Base1
{
public:
    virtual ~Base1(){};

    virtual const sName* GetName() = 0;
};

class Base2 : public Base1
{
public:
    Base2(){};
    virtual ~Base2(){}

    virtual const sName* GetName() { return &_name; }

private:
    sName _name;
};

class Base3 : public Base2
{
public:
    Base3(){}
    virtual ~Base3(){}
};

class Object : public Base3
{
public:
    Object(){}
    ~Object(){}
};

int main()
{
    Object object;
    Base1 *_logicalDevices[1] = {&object};

    const sName * test = _logicalDevices[0]->GetName(); // this is where it breaks sometimes when trying to access the GetName method
    std::cout<<test->name;
}

1 个答案:

答案 0 :(得分:2)

在您的代码中,snipet Object objectdefault initialized,系统会调用用户提供的默认构造函数。问题出在你的Base2默认ctor中,你没有_name字段的初始化,所以它被初始化为不确定值。我建议更改Base2构造函数并添加sName结构的构造函数:

 struct sName
 {
   uint8_t name;
   sName() : name(0) {}
 };

 class Base2 : public Base1
 {
   public:
     Base2()
      : _name()    // <--- Default ctor of sName called
     {};
     virtual ~Base2(){}

     virtual const sName* GetName() { return &_name; }

   private:
     sName _name;
};