0

如果我需要将 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; 
 }
4

3 回答 3

0

您不必这样做 - 但一个好的做法是释放与分配它们相同的级别。例如,不要在函数中分配某些东西并在它返回后释放它。因为几个月后,当您再次查看代码时,您并不清楚内存的生命周期。

所以最好是:

request = malloc();
doStuff( request );
free( request );

比你有的模式。C++ 通过创建构造函数和析构函数来帮助你处理这种模式。也就是说,构造函数实际上可能会分配内存并本质上以对象的形式将其返回给您,但是编译器会自动调用析构函数来释放内存。

因此,如果您将该请求缓冲区包装在一个类中,您可以使用更安全、更易于维护的模式来实现您想要的模式:

Request::Request() { mRequest = malloc(); }
Request::~Request() { if ( mRequest ) free( mRequest ); mRequest = NULL; }

...

{
    Request request;
    myFunction( request );
}

使用此模式,您的内存将自动清理。更安全,更易于维护。

于 2012-06-27T18:59:14.997 回答
0

使用free()完后立即使用它。因此,例如,您可能不会在内部执行此操作,myFunction()因为您可能仍然会对request退出该函数时指向的值感兴趣main

于 2012-06-27T18:18:18.853 回答
0

通常你必须在你分配它的地方释放它,并且不需要更多它。在这种情况下,您可以在两个地方都这样做,而且在释放后将其设置为 NULL,下次尝试释放它时,检查是否为 null

你也可以实现类似的东西:

void FreeAndNull(void *request){
   if request <> NULL then 
     { free(request); request = NULL; }
}
于 2012-06-27T18:22:03.550 回答