2011-11-22 33 views
1

我寫了一個自定義異常類來處理OLE自動化錯誤。該什麼()方法是這樣的:自定義C++異常類中消失的字符串

然而,當我嘗試打印它在我的main()函數返回字符串,我得到的是字母「I」。奇怪的部分是:當我取消註釋該方法倒數第二行時,它工作得很好,即我在終端上收到兩次相同的消息。我究竟做錯了什麼?

回答

1

正如其他人指出的那樣,c_str返回的指針在what返回的時刻無效,因爲ret已不再有效。

解決方法是將錯誤消息設置爲std::string類型的異常類的成員,並在構建時進行格式設置,而不是在what中進行格式設置。然後您可以安全地從c_str返回。

class OleException : std::runtime_error // just guessing here 
{ 
    std::string msg; 

    public: 
    OleException() 
    { 
     // construct msg 
    } 
    const char* OleException::what() const throw() { return msg.c_str(); } 
    // etc. 
}; 
+0

謝謝,它的工作! – xqrp

1

這是一個非常常見的錯誤:您正在返回一個指向由本地對象創建的數據的指針,該指針在離開該函數時被破壞。

3

您的問題是自動銷燬超出範圍的物體

您的std :: string res是what()方法的本地方法,並返回一個指向其內部的指針。當你離開函數時,本地對象被破壞,並且你正試圖使用​​現在懸掛的指針。

當你在what()方法中顯示它時,因爲在字符串被破壞前顯示字符串,所以沒有問題。

一個很好的解決問題的方法是使的std :: string資源您的異常類的數據成員。然後只要你的異常實例沒有被銷燬,你就可以安全地訪問字符串內容。