我想了解C++如何工作。當你在循環中聲明一個新變量(int x)時,例如在for循環中。內存分配給循環內的變量x,但退出for循環後會發生什麼?我的一個朋友的理解是Java會自動取消分配內存,但是C++呢?循環後變量的內存會發生什麼變化? (C++)
謝謝。
我想了解C++如何工作。當你在循環中聲明一個新變量(int x)時,例如在for循環中。內存分配給循環內的變量x,但退出for循環後會發生什麼?我的一個朋友的理解是Java會自動取消分配內存,但是C++呢?循環後變量的內存會發生什麼變化? (C++)
謝謝。
如果在棧上聲明(即,經由int x = ...
),並且當可變離開其範圍將被釋放。如果在堆中聲明,則不會被釋放(即通過int *x = new int(...)
)。在這種情況下,您必須明確使用delete
運算符。
感謝您的明確解釋。 – Cherple
在C++中,局部變量是自動,當他們走出去的範圍破壞。如果您在for
循環內聲明變量,則循環退出或前進到下一次迭代時它將被銷燬。
請注意,這不適用於分配在堆上的對象(例如,使用new
或std::malloc()
);他們需要被明確銷燬。
我這裏還有3個可能的情況下,在C++:
靜態存儲器,在其中一個對象是由鏈接器的節目的持續時間分配。全局和命名空間變量,靜態類成員和函數中的靜態變量分配在靜態內存中。在靜態內存中分配的對象只構造一次,並保留到程序的末尾。例如:
void f() {
for (;;) {
static int i = 0; //memory will not be deallocated until the program ends.
}
}
自動內存,其中分配函數參數和局部變量。將每個條目 轉換成函數或塊獲取其自己的副本。這種內存在退出其範圍時會自動創建並銷燬;因此名稱自動記憶。自動存儲器也被稱爲「在堆棧上」。例如:
void f() {
for (;;) {
int i = 0; //memory will be deallocated when get out of the loop's scope.
}
}
免費店,從記憶的對象是明確的計劃再次應要求在一個 程序可以釋放內存一旦用它做(用new
和delete
)。免費商店也被稱爲動態內存或堆。 例如:
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.
}
}
你覺得什麼'C++'應該還是會做什麼? – arunmoezhi
如果變量是本地的,一旦它退出循環的範圍,它就不能再訪問了。如果您爲變量預留了內存,則需要取消分配該內存。 – elbaulp
它是「不分配」的,即它不再作爲一個實體存在。對於用戶定義的類型,析構函數也被調用。 – juanchopanza