我有一个A类对象的问题,它继承了一个带有一些纯虚函数的基类B,并且我有一个ptr对象列表,我在那里添加了B类对象。问题是有时当我尝试从列表中的对象访问虚拟方法__vfptr表已损坏。列表中的对象没有被删除,我将用汽车拍摄一张照片。有没有人知道为什么会这样?事情是,如果我启动应用程序的一个或两个实例没有发生错误,但是当我启动更多实例时,它会在应用程序的第三个或第四个实例处给出访问冲突读取,这很奇怪。
或者你至少知道如何跟踪vftable的指针何时发生变化?因为该方法是从一堆地方调用的,我不可能用调试器跟踪所有这些,更不用说这个错误是随机发生的了。
非常感谢
更新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;
}
答案 0 :(得分:2)
在您的代码中,snipet Object object
为default 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;
};