我與 Run-Time Check #0 的第一次親密接觸

來源:互聯網
上載者:User

 某一天寫程式,調試時突然出現如下的錯誤提示:

Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call.  This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.

我很少遇到類似的C++運行時檢查錯誤,至於什麼堆棧指標丟失就更不用說啦,因為我寫的代碼全是按照C++預設的函數呼叫慣例,應該不會出現函式宣告和函數指標定義的呼叫慣例不一致的情況。

問題總是要解決的。跟蹤代碼,發現每次調用IComm對象的函數時就出現該錯誤。查看該對象的狀態,發現IComm的子類狀態亂七八槽,不是預期的狀態。

這裡先說一下類的結構。
IComm: 通訊器介面,抽象類別
ISerial: 串口通訊介面,抽象類別
CSerial: 串口通訊對象,同時實現IComm和ISerial介面(繼承自IComm和ISerial)

我是這樣初始化的:
ISerial * pSerial = new CSerial();  // 語句1
pSerial->SetPort(4);
pSerial->SetBaud(19200);
IComm * pComm = (IComm *) pSerial;  // 語句2
// 儲存pSerial和pComm

跟蹤發現,執行語句2後,pSerial的CSerial子類狀態是Port=4, Baud=19200;而pComm的CSerial子類狀態卻不是!

把語句2改為:
IComm * pComm = (CSerial *) pSerial;
後,狀態正確了,Run-Time Check Failure #0 也消失了。

分析:C++在父類子類相互類型轉換的時候,如果不正確地指定轉換路徑,那麼,對象的子類狀態和函數入口地址等記憶體將錯位,所以運行時類型檢查時,出現堆積指標丟失的錯誤,而不是什麼函數呼叫慣例不一致。

出現這種錯誤是由於我對C++的類型轉換不熟悉的結果。我一直使用C的類型轉換樣式,我想當然以為C++會幫我們把父子類類型轉換路徑完全做好。以後要複習一下C++類型轉換了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.