我有三個與此問題相關的類。我正在爲應用程序實施硬件服務。 PAPI(平臺API)是一個硬件服務類,用於跟蹤各種硬件接口。我實現了一個抽象的HardwareInterface類和一個派生它的類HardwareWinUSB。從函數返回將上下文更改爲NULL
下面是與我所做的相似的例子。我已經離開了,不會出現要與這一問題有關,類似的功能,打開USB連接件:
class PAPI {
HardwareInterface *m_pHardware;
PAPI() {
m_pHardware = new HardwareWinUSB();
}
~PAPI() {
delete m_pHardware;
}
ERROR_CODE WritePacket(void* WriteBuf)
{
return m_pHardware->write(WriteBuf);
}
};
class HardwareInterface {
virtual ERROR_CODE write(void* WriteBuf) = 0;
};
class HardwareWinUSB : public HardwareInterface
{
ERROR_CODE write(void* Params)
{
// Some USB writing code.
// This had worked just fine before attempting to refactor
// Into this more sustainable hardware management scheme
{
};
我一直是這樣,現在冥思苦想了好幾個小時。這是一個奇怪的,可重複的問題,但有時是間歇性的。如果我在更高的上下文中遍歷調試器,則執行得很好。如果我不深挖不夠,我會見了讀取
Exception thrown at 0x00000000 in <ProjectName.exe>: 0xC0000005: Access violation executing location 0x00000000
如果我挖下到PAPI代碼,我看到了怪異的行爲的錯誤。 當我在WritePacket的主體中設置斷點時,一切顯示正常。然後我在調試器中進行「一步一步」。從函數調用返回後,我對「this」的引用設置爲0x00000000。
這是怎麼回事?它看起來像一個空值被推入返回棧?有沒有人看過類似的事情發生過?我是否錯誤地使用虛擬方法?
編輯 進一步解剖後,我發現我打電話之前寫讀,我是讀入本地範圍內被宣佈爲緩衝區。當新閱讀進來時,他們被推入堆棧,破壞它。下一個稱爲write的函數將返回到已銷燬的堆棧。
發生什麼事是你的代碼中的某個地方發生了錯誤。一個共同的,花園多樣的錯誤的結果是「未定義的行爲」,其中你可觀察到的結果肯定有資格。你只需要弄清楚你的bug是什麼。不幸的是,沒有按照數字來繪製和追蹤錯誤的方法。如果有,我會失業... –
謝謝你的迴應,山姆。我明白這是一個錯誤。我一直在C++專業工作三年左右,並且還沒有看到返回堆棧像這樣被損壞的問題。我希望得到比我更有經驗的人的暗示,而不是「你的問題是你有問題。」 – Michael