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()ポイントされる値に関心がある可能性があるため、おそらく内部では実行しません。requestmain

于 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 に答える