簡體   English   中英

C ++訪問沖突

[英]C++ Access Violation

我正在研究一個現有的數據解析程序,它將結構覆蓋到緩沖區上以提取值。 最近,緩沖區中添加了一種新的數據格式,需要一個新的結構。 我將函數抽象為一個公共基類,並定義了一個像這樣的新結構:

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 * hdr;
hdr = m_parser->parse();
unsigned __int8 value = hdr->getCommonField1(); // Access Violation

我意識到上面的代碼片段缺少空指針檢查; 為簡潔起見,我排除了一些邏輯。 我已經跟蹤了代碼,一切似乎都在順利運行,直到嘗試在基類上調用方法。 在玩代碼時,我也看到成員函數不存在錯誤。

謝謝你的幫助。

您似乎在buffer使用內存而不在那里構造對象。 由於Header是多態的,它包含一個虛擬的表指針,你無法直接初始化它的數據(從法律上說,即使它是POD你也不能,但你可能會僥幸逃脫它)。

您應該使用placement new來構造bufferHeader對象。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM