返回“本地”堆分配对象可能导致内存泄漏

时间:2012-06-04 17:48:47

标签: c memory-management memory-leaks

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中的内存仍然存在?但是不可能免费,因此这是不好的代码?

2 个答案:

答案 0 :(得分: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

或者这个(没有泄漏,没有分配,除了堆栈上的var,没有性能损失):

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

答案 1 :(得分: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而不释放先前分配的内存块。这将导致内存泄漏,因为您不再有对该内存块的引用来解除分配:坏的,错误的代码!