2016-03-01 1 views
6

Cで関数を実行した後に割り当てられたメモリを解放する正しい方法は何ですか(malloc経由)?私はそれを解放しなければならないよりも、何らかの形でそれを使用し、それを戻して、メモリを割り当てる必要があります。関数の終了後に変数を "フリー"にする方法はありますか?

char* someFunction(char* a, char* b) { 
    char* result = (char*)malloc(la + 2 * sizeof(char)); 
    ... 
    return result; 
} 
+9

'のchar * strの= someFunctionを書くことができます(a、b)は; useitsomehow(文字列); free(str); ' –

+0

これは、ポインタが返されることを意味しています。これは、まったく同じポインタなので、" str "として解放することができますか? – JaxCze

+3

@JaxCze:はい、私はそれを「全く同じポインタ」と呼んでいません。まったく同じ値を持つ異なる(ポインタ)変数です。つまり、同じオブジェクトを指しています。 –

答えて

5

freeを使用してください。あなたのケースでは、それは次のようになります。

char* result = malloc(la + 2 * sizeof(char)); 
... 
free (result); 

strdupがないようにあなたは、割り当てられたメモリを返却している場合にも、あなたの関数の呼び出し側がメモリを解放する必要があります。同様に:あなたはそれを戻した後、それを解放することを考えているなら

result = somefunction(); 
... 
free (result); 

、それは不可能です。関数からの何かがreturnになると自動的に終了します。

+3

このコードスニペットはとてもそうです私は誤解がないことを願っています:それを返す前に**メモリを 'フリーにする 'べきではありません! – Marco13

3

割り当てられたメモリを返却する場合、それを解放するのは呼び出し元の責任です。

char *res; 
res = someFunction("something 1", "something 2"); 
free(res); 
6

someFunctionというコードで。

ます。また、ドキュメントで明確にした後、戻り値の使用を終了し、呼び出し側freeを呼び出すために持っていること、(あなたは、その権利?!持っています)。

3

あなたはreturnそれを呼び出し関数にして、ちょうどfree呼び出し関数のポインタです。あなたは、その副作用のために返された値を呼び出し元の関数で必要とされないと、関数が呼び出されることを意味している場合

3

次に、あなただけの

free(someFunction(p, q)); 
+0

私はこのようなことを意味しませんでしたが、このヒントは私にとって役に立ちます:)ありがとう – JaxCze

関連する問題