我正在研究一個現有的數據解析程序,它將一個結構覆蓋到一個緩衝區中以提取值。最近一種新的數據格式已被添加到緩衝區,並需要一個新的結構。我抽象功能集成到一個公共的基類,並定義了新的結構是這樣的:C++訪問衝突
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
我實現上述代碼段缺少空指針檢查;爲了簡潔,我已經排除了一些這種邏輯。我已經追蹤了代碼,並且在嘗試調用基類上的方法之前,所有內容都可以順利運行。在玩代碼時,我也看到成員函數不存在錯誤。
感謝您的任何幫助。
你能告訴我們初始化緩衝區嗎? – JaredPar
什麼是「緩衝區」? –
不幸的是,這並不容易。緩衝區實際上是作爲另一個結構的一部分傳遞給解析函數的。它的初始化深埋在我不敢觸及的一些C++代碼的深處。我應該注意到,我簡化了上面代碼片段的代碼。 – bporter