2014-04-21 97 views
1

我想了解C++如何工作。當你在循環中聲明一個新變量(int x)時,例如在for循環中。內存分配給循環內的變量x,但退出for循環後會發生什麼?我的一個朋友的理解是Java會自動取消分配內存,但是C++呢?循環後變量的內存會發生什麼變化? (C++)

謝謝。

+0

你覺得什麼'C++'應該還是會做什麼? – arunmoezhi

+0

如果變量是本地的,一旦它退出循環的範圍,它就不能再訪問了。如果您爲變量預留了內存,則需要取消分配該內存。 – elbaulp

+0

它是「不分配」的,即它不再作爲一個實體存在。對於用戶定義的類型,析構函數也被調用。 – juanchopanza

回答

3

如果在棧上聲明(即,經由int x = ...),並且當可變離開其範圍將被釋放。如果在堆中聲明,則不會被釋放(即通過int *x = new int(...))。在這種情況下,您必須明確使用delete運算符。

+0

感謝您的明確解釋。 – Cherple

1

在C++中,局部變量是自動,當他們走出去的範圍破壞。如果您在for循環內聲明變量,則循環退出或前進到下一次迭代時它將被銷燬。

請注意,這不適用於分配在堆上的對象(例如,使用newstd::malloc());他們需要被明確銷燬。

1

我這裏還有3個可能的情況下,在C++:

  1. 靜態存儲器,在其中一個對象是由鏈接器的節目的持續時間分配。全局和命名空間變量,靜態類成員和函數中的靜態變量分配在靜態內存中。在靜態內存中分配的對象只構造一次,並保留到程序的末尾。例如:

    void f() { 
        for (;;) { 
         static int i = 0; //memory will not be deallocated until the program ends. 
        } 
    } 
    
  2. 自動內存,其中分配函數參數和局部變量。將每個條目 轉換成函數或塊獲取其自己的副本。這種內存在退出其範圍時會自動創建並銷燬;因此名稱自動記憶。自動存儲器也被稱爲「在堆棧上」。例如:

    void f() { 
        for (;;) { 
         int i = 0; //memory will be deallocated when get out of the loop's scope. 
        } 
    } 
    
  3. 免費店,從記憶的對象是明確的計劃再次應要求在一個 程序可以釋放內存一旦用它做(用newdelete)。免費商店也被稱爲動態內存或堆。 例如:

    void f() { 
        for (;;) { 
         int * pi = new int; //memory newed will not be deallocated until delete called. 
              //memory of the pointer self will be deallocated when get out of the loop's scope, same as case 2. 
        } 
    } 
    
相關問題