2012-03-20 51 views
2

當我在這個函數上運行valgrind時,它說我肯定已經丟失了4個字節。我知道這是因爲我重定向x = y中的指針x,從而失去了訪問第一行中分配的初始內存的權限。我該如何解決?這裏的正確原則是什麼?我只是在學習C,所以我試圖去理解這一切。謝謝!在C內存泄漏中重定向指針

int main() { 
    int* x = malloc(sizeof(*x)); 
    int* y = malloc(sizeof(*y)); 
    *x = 2; 
    *y = 5; 
    x = y; 
    *y = 6; 
    *x = 4; 
    printf("y = %d\n", *y); 

    free(x); 
    free(y); 

    return 0; 
} 
+0

嗨,傑森是對的 – madper 2012-03-20 01:11:42

回答

2

x指向一個int,那麼該地址被覆蓋x = y;(如您所料),但前一個地址指向的空間未被釋放。xy然後包含相同的地址,因此都指向內存中相同的空間,因此您的free()調用都試圖釋放相同的位置。

如果你不想只是以前x = y;

+0

太棒了,這就是我要找的!我知道代碼不是很有用,但它只是我試圖學習的概念。謝謝! – quantum 2012-03-20 01:29:10

3

恐怕答案是:當你與他們所做的free分配和做他們不失去跟蹤在此之前。

現在你所要做的就是學手藝的深體上確保這種情況發生......


順便說一句,你有雙重free「編一個分配上面是另一個bug。

int* tmp = x; 
x = y; 
y = tmp; 

這可以包裹:

5

通過確保您的值賦給一個臨時指針變量第一,這樣你就不會失去最初被分配到y指針值利用適當的交換IDOM在void swap(void** a, void** b)功能,以便您不必亂拋垃圾你的代碼與臨時變量。它看起來像:

void swap(void** a, void** b) 
{ 
    void* tmp = *a; 
    *a = *b; 
    *b = tmp; 
} 

你可以稱它爲swap(&x, &y);

另外,截至目前,沒有你的指針交換固定,將碼

free(x); 
free(y); 

是的一個例子的雙自由由於xy變量包含相同的指針值。雙釋放導致未定義的行爲,所以你不想這樣做。使用適當的交換習慣可以防止這種情況。

0

你釋放y兩次並且永不釋放x(因爲x現在保存y的值)。

另外,你爲什麼不開始接受更多的回覆?它可能會讓人更傾向於幫助你。

+0

仔細看看他做了什麼。它總是獲得分配的權利 - 即使類型稍後改變 - 這使得它更強大,然後您的建議。 – dmckee 2012-03-20 01:04:56

2

如果你正在尋找通過y的整數指向x分配的整數指出價值,那麼你可能想:

*x = *y; 

分配你正在做的是覆蓋x,而不是使用它的值訪問你的整數存儲的內存(即解引用它)。

順便說一句,除了與當前的代碼泄露,你也做了雙免費因爲xy具有相同的價值,這也是一個(大)的問題。

2

泄漏的4個字節,放在free(x);當分配:

x = y; 

你失去的指針存儲在(地址previosuly分配的內存) x。 要解決它,只是不要這樣做。如果你這樣做,你會未定義行爲這可能符合意味着你的程序的崩潰(通常在以後的時間):

free(y); 

因爲你attemting釋放同一內存的兩倍。

我懷疑你想分配存儲在分配的內存,沒有地址,值做,你應該:

*x = *y; 

代替 - 這將解決你的「失去的記憶」的問題和不確定的行爲(雙自由)。