2013-02-18 211 views
-1

所以我知道mallocs適用於堆而不是堆棧。內存管理c

我有幾個問題:

這段代碼是否被分配或釋放?

我沒有看到任何自由語句,所以我假設什麼都沒有被釋放,所以有內存泄漏正確?

只是爲了保持curisoity,如果我嘗試釋放ptr,它會崩潰。如果我嘗試釋放處理它雖然工作正常。

int num; 
     int *ptr; 
     int **handle; 

     num = 14; 
     ptr = (int *)malloc(2 * sizeof(int)); 
     handle = &ptr; 
     *ptr = num; 
     ptr = # 
     handle = (int **)malloc(1 * sizeof(int **)); 

回答

6

是的,這段代碼使用malloc調用分配內存。當您嘗試在末尾釋放ptr時看到崩潰,不過因爲它被重新分配到&num,該分配在堆棧上且不能被釋放。不僅因爲取消分配堆棧變量是有意義的(因爲它將在函數退出時被拋棄),但由於它沒有被明確分配,所以這樣做也是不合法的。您仍然可以免費使用handle,因爲它仍然指向它分配的堆本地存儲。

要回答你的其他問題,是的,有內存泄漏。此外,因爲ptr已被設置爲指向其他地方,所以現在不可能釋放它指向的原始內存,因爲您不再知道原始地址。

1

是的,它分配內存使用malloc這是不釋放,所以有泄漏。您覆蓋了ptr中地址爲num的malloced內存的地址,因此您無法解除該問題。初始malloced內存的地址丟失,所以這是一個泄漏。

1

如果沒有空閒,則會發生內存泄漏。 (與valgrind一起檢查)

不能釋放ptr,因爲它指向一個無法釋放的堆棧變量存儲區(請參閱指令ptr = #)。