2012-06-04 44 views
1
int do_memory() 
{ 
    int * empty_ptr = (int *) malloc(sizeof(int)); 
    *empty_ptr = 5; 
    return *empty_ptr; 
} 
... 
int b = do_memory(); 
free(&b); //obviously not valid 

b超出範圍,我會正確地假設empty_ptr中的內存仍然存在?但不可能免費,因此這是不好的代碼?通過返回「本地」堆分配對象可能的內存泄漏

+0

「當b超出範圍時,我認爲empty_ptr中的內存仍然存在?」是。 「但是不可能免費,因此這是不好的代碼?」是的。 –

回答

4

「int * empty_ptr」(指向已分配內存塊的指針)永遠不會被釋放,您只需從do_memory獲取返回值即可。

如果你想無泄漏,使用此

int* do_memory() 
{ 
    int * empty_ptr = (int *) malloc(sizeof(int)); 
    *empty_ptr = 5; 
    return empty_ptr; 
} 
... 
int* b = do_memory(); 
int b_local = *b; 
free(b); // valid 

或本(無泄漏,無分配除了在堆棧中的變種,沒有性能損失):

void do_memory(int* RetValue) 
{ 
    *RetValue = 5; 
} 
... 
/// b is allocated locally on stack 
int b; 
do_memory(&b); 
// no free() calls are needed 
+0

我想我明白malloc現在如何工作。感謝你的回答。 – user1420741

2

函數簽名是錯誤的,更新爲:

int* do_memory() 
{ 
    // code 
} 

... 

int* b = do_memory(); 

// At this point, freeing b is valid and will 
// release the resources previously allocated in do_memory() 
free(b); // valid 

但是,如果你沒有free(b)和功能完成它會在不釋放先前分配的內存塊的情況下銷燬變量b。這會導致內存泄漏,因爲您不再需要引用該內存塊來取消分配:錯誤的代碼!

+0

+1,但在C中,一個真正的原型(不僅僅是一個聲明)將是'int * do_memory(void)'。 –