gpt4 book ai didi

C++ 访问冲突

转载 作者:太空狗 更新时间:2023-10-29 20:46:46 26 4
gpt4 key购买 nike

我正在开发一个现有的数据解析程序,该程序将结构覆盖到缓冲区上以提取值。最近,一种新的数据格式被添加到缓冲区中,并且需要一个新的结构。我将函数抽象为一个公共(public)基类并定义了一个新结构,如下所示:

struct Header
{
Header () { }

public:
virtual unsigned __int8 getCommonField1() const = 0;
}

struct HeaderTypeA : public Header
{
unsigned __int8 Field1;

public:
unsigned __int8 getCommonField1() const { return Field1; }
}

struct HeaderTypeB : public Header
{
unsigned __int8 Field0;
unsigned __int8 Field1;

public:
unsigned __int8 getCommonField1() const { return Field1; }
}

执行处理的现有代码评估数据(这是有效的)并返回一个指向调用函数的指针......像这样:

Header* parse()
{
Header* parsedHeader = 0;

if (typeADetected)
{
parsedHeader = (HeaderTypeA *) &buffer[offset];
// Other logic here...
}
else if (typeBDetected)
{
parsedHeader = (HeaderTypeB *) &buffer[offset];
// Other logic here...
}

return (parsedHeader);
}

问题出在解析逻辑的调用者。当 header 作为指针返回时,对成员函数的调用会导致访问冲突错误:

Header * hdr;
hdr = m_parser->parse();
unsigned __int8 value = hdr->getCommonField1(); // Access Violation

我意识到上面的代码片段缺少空指针检查;为了简洁起见,我排除了一些逻辑。我已经跟踪了代码,一切似乎都在顺利运行,直到尝试调用基类的方法。在处理代码时,我还看到了成员函数不存在错误。

感谢您的帮助。

最佳答案

您似乎正在使用 buffer 中的内存,而没有在那里构造对象。由于 Header 是多态的,它包含一个虚拟表指针,你不能直接初始化它的数据(合法你不能,即使它是一个 POD 但你可能会逃脱它)。

你应该使用 placement new为了在buffer中构建Header对象。

 parsedHeader = new (&buffer[offset]) HeaderTypeA;

关于C++ 访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7273085/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com