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 中的内存仍然存在是对的吗?但是不可能释放,因此这是错误的代码?
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 中的内存仍然存在是对的吗?但是不可能释放,因此这是错误的代码?
“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
函数签名错误,更新为:
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
而不释放先前分配的内存块。这将导致内存泄漏,因为您不再有对该内存块的引用来取消分配:糟糕,糟糕的代码!