[英]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
來構造buffer
的Header
對象。
parsedHeader = new (&buffer[offset]) HeaderTypeA;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.