我寫了一個自定義異常類來處理OLE自動化錯誤。該什麼()方法是這樣的:自定義C++異常類中消失的字符串
然而,當我嘗試打印它在我的main()函數返回字符串,我得到的是字母「I」。奇怪的部分是:當我取消註釋該方法倒數第二行時,它工作得很好,即我在終端上收到兩次相同的消息。我究竟做錯了什麼?
我寫了一個自定義異常類來處理OLE自動化錯誤。該什麼()方法是這樣的:自定義C++異常類中消失的字符串
然而,當我嘗試打印它在我的main()函數返回字符串,我得到的是字母「I」。奇怪的部分是:當我取消註釋該方法倒數第二行時,它工作得很好,即我在終端上收到兩次相同的消息。我究竟做錯了什麼?
正如其他人指出的那樣,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.
};
這是一個非常常見的錯誤:您正在返回一個指向由本地對象創建的數據的指針,該指針在離開該函數時被破壞。
您的問題是自動銷燬超出範圍的物體。
您的std :: string res是what()方法的本地方法,並返回一個指向其內部的指針。當你離開函數時,本地對象被破壞,並且你正試圖使用現在懸掛的指針。
當你在what()方法中顯示它時,因爲在字符串被破壞前顯示字符串,所以沒有問題。
一個很好的解決問題的方法是使的std :: string資源您的異常類的數據成員。然後只要你的異常實例沒有被銷燬,你就可以安全地訪問字符串內容。
謝謝,它的工作! – xqrp