2012-06-04 21 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)'。 –