2013-02-22 100 views
0

我主要使用高級編程語言 ,但 所以昨天一位朋友問我如何幫助他解決一個簡單的C++練習,並且在編寫它時我編寫了這段代碼:簡單內存問題練習

for (int x = 0; x < 10; x++){ 
    int a, b, c; 
    a = x; 
    b = x*2; 
    c = x+5; 
} 

我的問題在這裏:這會導致內存泄漏作出,b,C總是在不同的存儲位置來創建,或者將它們始終與每一個循環改寫?如果你有動態(通過調用newnew []malloccalloc)分配的變量

+3

第 – 2013-02-22 15:12:28

+0

你問關於C還是C++?請選擇一個並移除其他標籤。 – 2013-02-22 15:13:10

+2

@Robᵩ - 答案與C和C++相同:否。 – 2013-02-22 15:14:50

回答

11

內存泄漏時纔會發生。您的代碼中沒有任何內容,所以

什麼是本地或自動變量。正如名稱所示,當創建它們的作用域{}結束時,自動變量將被隱式釋放。

3

a,bc將被分配在堆棧上。自動變量永遠不會導致內存泄漏,除非類型本身通過其構造函數和/或析構函數導致泄漏。

關於他們是否會覆蓋每個循環的問題:我強烈懷疑地球上的每一個編譯器都會這樣做,但原則上這是不能保證的。如果您查看彙編輸出,您會發現(a)所有變量都在寄存器中,或者(b)它們從堆棧指針中檢索爲固定偏移量。由於每次通過循環執行相同的程序集,它們確實會被覆蓋。

+0

如果它們在內部動態分配資源並且不在釋放它們的析構函數中,或者沒有其他機制釋放資源,它們可能會泄漏。 – juanchopanza 2013-02-22 15:15:44

+0

這是一個公平點,我已經相應更新 – 2013-02-22 15:20:58

+0

@juanchopanza:如果我們假設類的設計是正確的。然後在用作自動變量時它們不會泄漏。 – 2013-02-22 16:50:14

0

在循環的每次迭代中,內存中的相同位置將用於存儲a,bc中的值。

2

你問三個問題:

這將導致內存泄漏

沒有,這裏沒有內存泄漏。正如該術語通常使用的那樣,存儲器泄漏需要沒有deletenew,沒有delete[]new[]或沒有free()malloc()

A,B,C總是在記憶

他們可能是不同的位置創建。他們可能不是。這是您程序不需要知道的實現細節。所有你需要知道的是,對象是在定義它們的行上創建的,並在該範圍的右括號處銷燬。

他們將與每一個循環總是覆蓋?

他們可能。他們可能不是。這是你的程序不需要知道的實現細節。無論它們是否被覆蓋,每次都會在循環中被銷燬。

0

,如果你創建一個這樣

int i = 5; 

一個變量,編譯器將它們放置在堆棧上,你不必解除分配INT。 但是如果你在堆上創建一個INT,

int* i = new int; /*C++ style*/ 
int* j= (int*) malloc(sizeof(int)); /*C style*/ 

你必須解除分配內存是這樣的:

delete i; /*C++ style*/ 
free(j); /*C style*/ 

否則,你將有內存泄漏。 最重要的是你不想混合使用c和C++風格的內存處理。

+0

術語堆/堆棧在描述C++時沒有用處。你想要的術語是「自動存儲」和「動態存儲」。請參閱http://stackoverflow.com/q/6403055/14065 – 2013-02-22 16:53:55

+0

@Loki Astari感謝您提供的信息,我目前還沒有意識到這一點。 – hetepeperfan 2013-02-22 19:12:27