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