我是C 例外處理的新手。我試圖拋出一個例外指標并捕獲它,但后來捕獲的例外似乎與我拋出的例外不一樣。 下面是我的代碼:
try {
bad_exception e2 = bad_exception();
cout << e2.what() << endl;
cout << &e2 << endl;
throw &e2;
}
catch (bad_exception* ex) {
cout << ex << endl;
cout << ex->what() << endl;
cout << (*ex).what() << endl;
}
輸出:
壞的例外
00CFFCF8
00CFFCF8
未知的例外
我以為后面會顯示同樣的名字 "bad exception"。你能解釋一下嗎?
更新:
似乎這個例外有 "自動洗掉 "的功能?我試著拋出一個普通物件的指標(不繼承于例外)。但是我仍然可以在捕獲塊中訪問該物件和它的屬性。
try {
char str[5] = "eed8";
A a = A()。
a.name1 = str;
cout << a.show() << endl;
cout << &a << endl;
throw &a;
}
catch (A* exp) {
cout << exp << endl;
cout << exp->show() << endl;
cout << exp->name1 << endl;
}
輸出:
eed8
007BF9DC
007BF9DC
eed8
eed8
uj5u.com熱心網友回復:
你應該按值拋出例外(通常)。
這里的問題是你正在拋出一個指向物件的指標。不幸的是,當這個指標被捕獲時,它所指向的物件已經被銷毀,因此你有一個無效的指標。
try {
bad_exception e2 = bad_exception();
cout << e2.what() << endl;
cout << &e2 << endl;
throw &e2;
} //此時,物件 "e2 "超出了范圍。
//因此它的析構器被呼叫。
//所以你拋出的指標現在指向了一個無效的物件。
//span>因此,通過這個指標訪問該物件是不合法的。
catch (bad_exception* ex) {
cout << ex << endl;
cout << ex->what() << endl;
cout << (*ex).what() << endl;
}
重新寫成這樣:
try {
bad_exception e2 = bad_exception();
cout << e2.what() << endl;
cout << &e2 << endl;
throw e2; //throw a copy.。
//拋出一個被復制到安全位置的物件。
///這樣,當你抓到它時,它仍然有效。
}
catch (bad_exception const& ex) { // catch and get a reference to the copy.
cout << &ex << endl;
cout << ex.what() < < endl;
}
如果你絕對必須拋出一個指標,那么使用new來確保指標有一個動態的壽命(但是記住,你需要清理它)。
更新:
看來這個例外有 "自動洗掉 "的功能?
沒有的事。
我試著拋出一個指向正常物件的指標(不是從例外中繼承的)。
例外物件(或其任何派生類)沒有任何特別之處。它只是一個普通的物件。像所有的物件(是一個類)一樣,當物件的生命周期結束時,物件的析構器會被運行。如果
A沒有一個析構器,那么該物件所使用的記憶體可能不會改變(但是它不能被不是你的物件的其他物件使用)。但是我仍然可以在catch塊中訪問該物件和它的屬性。
這就是 "未定義行為 "的糟糕一面。我可能看起來像是在作業。它并沒有作業,只是看起來像在作業。而且在其他情況下,它同樣有可能不作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/321872.html
標籤:
上一篇:C 中兩個"無序集合"的交集在類方法中"不起作用",但在"集合"中卻起作用?
下一篇:從Python中運行C 函式
