簡體   English   中英

在C ++中刪除堆棧變量

[英]Deletion of stack variable in C++

在C ++中,如果我們在函數內部聲明一個堆棧變量,它是在函數末尾自動刪除還是在程序執行結束時刪除?

此外,對於C語言,這個問題的答案是否相同?

對於堆棧聲明的變量,將調用析構函數並在內存超出范圍時回收內存。

請注意,如果變量是在內部塊中聲明的,如if語句或循環,則這並不意味着在函數的末尾。

int main(int argc, char **argv)
{
    int a = 3;

    if (argc > 1)
    {
        int b = 5;
        ++b;
    } // b is destructed here

    // a is destructed here
    // argv and argc are destructed here (or with a)
}

編輯 :關於如何退出范圍無關緊要的事實是一個很好的觀點。 所以...

#include <vector>
# include <exception>

int main(int argc, char **argv)
{
    std::vector<int> myVector(10);

    try
    {
        if (argc)
        {
            int a = 10;
            int b = 12;
            for (int c = 0; c < b; c++) // lol
            {
                int c_squared = c*c;
                int theEleventhElement = myVector.at(c);
                // the above will throw std::out_of_range at some point!
            }
        }
    }
    catch (std::out_of_range &ex)
    {
        // do nothing
    }
}

當上面拋出時,堆棧將作為異常處理的一部分展開。 因此,變量將按以下順序銷毀:

  • c_squared
  • c
  • ba (我想按順序,但我不知道這是否符合標准)

此時,最后一個catch處理程序只有myVector仍在范圍內。 該塊忽略異常,然后main在該點ends-- myVector被破壞。

根據具有自動存儲持續時間的3.7.2對象, 直到創建它們的塊的退出為止 ,在6.6.2中有更多細節:

在從范圍退出( 但是已完成 )時,將對所有具有自動存儲持續時間(3.7.2)(命名對象或臨時值)的構造對象調用析構函數(12.4),這些對象在其范圍內聲明,其順序與其聲明相反。 從循環中移出一個循環,或者從具有自動存儲持續時間的初始化變量返回過去涉及銷毀具有自動存儲持續時間的變量,這些變量在轉移點但不在轉移點處的范圍內。

它超出范圍時會被銷毀。 C相同

自動變量在其封閉范圍的末尾自動銷毀。

為了避免使用new運算符的歧義,可能更合適的做法是在離開函數時“彈出”變量:參見基於堆棧的內存分配 .C也是如此。

堆棧變量或多或少是通過遞減堆棧指針從堆棧中削減的幾個字節,在函數結束時刪除它,而不是簡單地再次向上移動堆棧指針(用戶定義類型的情況)在C ++中因為額外的破壞性東西。

在C中,移動堆棧指針以擺脫所持有的變量是一個簡單的例子。

暫無
暫無

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

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