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 中的内存仍然存在是对的吗?但是不可能释放,因此这是错误的代码?

4

2 回答 2

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
于 2012-06-04T17:51:32.227 回答
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而不释放先前分配的内存块。这将导致内存泄漏,因为您不再有对该内存块的引用来取消分配:糟糕,糟糕的代码!

于 2012-06-04T17:51:39.770 回答