簡體   English   中英

當我們拋出一個要捕獲的對象/變量時會發生什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM