簡體   English   中英

為優化級別為 0 的 std::vector 調用兩次析構函數

[英]destructor is called twice for std::vector with optimization level 0

我正在嘗試使用compiler explorer理解為std::vector及其emplace_back (or) push_back函數生成的匯編代碼。

注意:優化級別為 0,即使用 -O0

我無法理解的一件事是,為什么要調用兩個析構函數而不是一個析構函數(如您所見,只創建了一個向量。如果我假設在內部創建了一個臨時對象,那么至少我必須看到對std::vector構造函數的調用。

這與 clang 編譯器相同。

有人可以解釋一下這里發生了什么嗎?

編輯1:

#include <vector>
int main()
{
    std::vector<int> vec;
    vec.emplace_back(10);
}

編輯 2:刪除了屏幕截圖,因為它很難閱讀。

第 34 行有一條線索: call _Unwind_Resume 該代碼塊,從第 28 行到第 34 行,用於在拋出異常時進行堆棧展開。 正常的代碼路徑通過第 25 行的析構函數調用,然后在第 27 行跳過異常代碼,跳轉到第 35 行,然后從函數返回。

澄清一下,這里有一個神奇之處:對_Unwind_Resume的調用不會返回給調用者。 這是一個技巧,獲取正在執行的塊的地址,以便異常處理代碼可以確定它在哪里並繼續向上堆棧。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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