[英]What happens when we throw an object/variable to catch?
兩個問題1)當拋出一個對象/變量來捕捉時會發生什么? 舉例來說,
int foo() {
FILE *fp = ....;
int dummy = 10;
int *dummy_ptr = new int[10];
throw 1;
}
int main() {
try {
foo();
} catch (int &i) {
std::cout<<"ERROR, the value is "<<i<<std::endl;
}
}
在這種情況下,這里會發生什么? 創建並傳遞了一個新變量???
如果我使用無參考的指針或變量該怎么辦
像catch(int * i)//或catch(int i)
此外,是否已釋放/關閉范圍內聲明或初始化的所有變量/資源?
2)同樣在重新拋出的情況下,如果我計划使用引用進行重新拋出,則第二個捕獲將獲得一個新變量,如果我使用值不使用引用進行重新拋出(即),那么在中間拋出中所做的更改將不受影響....
int goo() {
throw 2;
}
int foo() {
try{
goo();
} catch(int &i) { // (or) catch(int i) // i is not changing in the next line.
i = 2;
throw;
}
}
int main() {
try {
foo();
} catch (int &i) {
std::cout<<"ERROR, the value is "<<i<<std::endl;
}
}
輸出:catch(int&i)//打印2 catch(int i)//打印1
根據我的判斷
我認為,只要在中間步驟中“按值傳遞”,該值就會受到影響。 它仍然將原始對象扔到第二個捕獲。
(即)變量的控制流實際上不會拋出中間捕獲。
在這種情況下,這里會發生什么? 創建新變量然后傳遞?
是; 當您拋出一個對象時,它會在某個地方創建,然后在處理完異常之后將其銷毀(也就是說,在不重新拋出就離開catch
塊之后)。
如果我使用沒有引用的指針或變量該怎么辦? 同樣在被重新拋出的情況下...
如果按值捕獲,則將獲得該對象的副本-如果重新引發異常,則下一個處理程序將獲得原始對象的新副本,並且不會看到您可能進行的任何更改。 通過引用捕獲將為您提供對所拋出對象的引用-如果重新拋出,則下一個處理程序將看到您所做的任何更改。 您不能通過指針捕獲對象-僅在拋出指針時才捕獲指針。
此外,是否已關閉范圍內聲明或初始化的所有變量?
引發異常時,將在throw
范圍和所有封閉范圍內銷毀所有自動變量,直到到達處理程序為止。 動態分配的變量(例如您的new int[10]
) 不會被刪除,並且FILE*
變量當然不會調用fclose
類的任意清理函數,除非它們由基於范圍的對象(例如智能指針)管理。
是的,當引發異常時,將在引發范圍和所有封閉范圍內銷毀所有自動變量,直到到達處理程序為止。
關於這一點,請注意, dummy_ptr*
的內存不會被釋放,並且FILE
指針fp*
也不會關閉。
我認為您不能將其稱為變量。 它沒有名字。 但是將在實現確定的未指定位置創建一個int
類型的新對象。 當您通過引用捕獲時,引用將綁定到該隱藏對象。 當您從catch塊的末端掉落,或者通過拋出相同異常以外的任何方式離開catch塊時,對象將被“釋放”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.