2009-08-20 13 views
10

私はmallocで割り当てられた変数を解放するべきだと知っていますが、それを関数に返すとどうなりますか?このようなもの:割り当てられた変数を返す

char *somefunction(int somearg){ 
    char *str; 

    str=(char *)malloc(sizeof(char *)); 

    //some code 

    return str; 
} 

strを解放する必要がありますか?どうすればいい?

+2

引数Cの中の 'malloc'の値)。 'str = malloc(N * sizeof * str);'はそれを書く良い方法です。 – caf

+0

CAFが述べたように、malloc()の戻り値をキャストしないでください。 http://stackoverflow.com/questions/1565496/specifically-whats-dangerous-about-casting-the-result-of-mallocら – Mawg

答えて

13

2つのオプションがあります:1つは、ある関数にchar *を渡し、ある関数内で割り当てる代わりに、または2つでは、後で戻り値を解放することです。

最初のオプション:

char *somefunction(char *str, int somearg){ 

    //some code 

    return str; 
} 

// Elsewhere... 
char *str = (char *) malloc....; 
somefunction(str, 123); 
// Code... 
free(str); 

番目のオプション:

char *somestr = somefunction(123); 
// Do something... 
free(somestr); 

それはarbitary関数内で割り当てられていないとき、それはメモリリークを避けるために、少し簡単だと私は個人的には、最初のオプションを提案。

+1

良い解答(質問)を参照してください、私は最近、同じ問題につまずきました。 1つの質問:関数の戻り値に必要なメモリ量を事前に決定することが難しい場合はどうすればよいですか?それでは、関数内で割り当てるのがより自然に思えるでしょう。さもなければ、(例えば可変長の文字列を返すために)与えられたメモリ空間が小さすぎる場合、関数内でエラー処理が必要になります。 – sleske

+0

可変長文字列は、関数内にメモリが割り当てられていることを正当化できます。しかし、私自身のプロジェクトでは、このようなコードについては非常に気にせず、むしろコードのコンテキストと要件に基づいて選択される最大長を明示的に指定することを好みます。どんな種類の可変長の文字列について話していますか?あらかじめ割り当てられていた数KB/MBを超えることはできませんでしたか? –

2

割り当てられたスペースをすべて解放する必要がありますが、プログラムの他の部分でこれらのメモリスペースを使用するため、そのスペースを返す場合は、使用した後に解放する必要があります。関数を呼び出すコード内のすべての場所を参照し、戻り値を使用した後に領域を解放します。

2

ブロックのアドレスを返す予定がある場合は、ブロックを解放する必要はありませんが、代わりに呼び出しコードを使用して後で解放してください()。これはオンウェルジパスと呼ばれています。

関数内で解放してポインタを返すと、呼び出したコードは、すでに解放されているブロックにアクセスしようとして、未定義の動作になります。

4

これで終了します。 malloc()と一致するfree()が同じ関数内になければならないという規則はありません。

+0

なので、私はfree(str)関数かfree(somefunction)のような何かをすることができますか? –

+1

はい、本当にありがとうございます。あなたはmalloc()を使うことができるのとまったく同じですが、これはまったく別の関数の後です。 –

2

これはいくつかの既存の機能(例:strdup())の習慣ですが、一般的には悪い考えです。関数呼び出しの中で何が起こるのかをユーザに認識させることは、必要条件ではありません。内部関数がどれだけ隠されているのかを考えてください。 一般的に言えば、ユーザーにバッファーとメモリーを割り当てる代わりにサイズを渡したい場合があります。あなたは `のchar *`を格納するのに十分なメモリを割り当てるが、char` `を指すポインタに代入(とリターンをキャストする必要はありませんしている - `のmalloc() `ほぼ確実に間違っていると

+1

合意されていますが、どれだけのスペースが必要であるか(例えば返される文字列を動的に作成するなど)を事前に決定することが難しい場合はどうでしょうか。それで、関数が必要なだけ多くのメモリを割り当てることは、より自然な(より単純な)ように思えます。どう思いますか? – sleske

+0

非常に良い点。しかし、現実には、データベースのフィールドや画面やフォーマットされた出力に合わせなければならないので、刺しゅうの長さは常に分かっています。もちろん、必要なときだけ255バイトを割り当てるのは無駄です。そのため、実装する内容によって異なります。私はWindowsアプリケーションではあまり心配しませんが、8ビットマイクロ上の組み込みシステムは、色付きの馬の異なるケトルです。 – Mawg

関連する問題