如果我需要将unsigned char *传递给函数,我何时可以释放我的unsigned char *? 实施例
void myFunction(unsigned char *request){
// do I need to use free(request); here?
}
int main (){
// main code
unsigned char *request = NULL;
// read from buffer and reallocate memory (using realloc & memcpy)
myFunction(request); // I do not want to read or use "request" after this function call.
free(request); // is this ok? Or should this be inside myFunction also?
return 0;
}
答案 0 :(得分:0)
使用完成后立即使用free()
。因此,例如,您可能不会在myFunction()
内执行此操作,因为当您将该函数退回到request
时,您可能仍会对main
指向的值感兴趣
答案 1 :(得分:0)
通常你必须在分配它的地方释放它,并且不需要更多它。 在这种情况下,您可以在两个位置执行此操作,但在释放后将其设置为NULL,下次当您尝试释放它时,请检查是否为空
你也可以实现类似的东西:
void FreeAndNull(void *request){
if request <> NULL then
{ free(request); request = NULL; }
}
答案 2 :(得分:0)
您不必这样做 - 但一个好的做法是将事物放在与分配它们相同的级别。例如。不要在函数中分配内容并在返回后释放它。因为几个月后再次查看代码时,内存的生命周期并不清楚。
所以最好:
request = malloc();
doStuff( request );
free( request );
比你的模式。 C ++通过创建构造函数和析构函数来帮助您使用此模式。这是一个构造函数实际上可以分配内存并基本上以对象的形式将它返回给你,但编译器会自动调用析构函数来释放内存。
因此,如果将请求缓冲区包装在类中,则可以使用更安全且更易于维护的模式来实现所需的模式:
Request::Request() { mRequest = malloc(); }
Request::~Request() { if ( mRequest ) free( mRequest ); mRequest = NULL; }
...
{
Request request;
myFunction( request );
}
使用此模式可以自动清理内存。更安全,更易于维护。