0

このトピックの主題のように。私は簡単な機能を持っています:

char *to_str(int x)
{
    char *s = malloc(6);

    if (s == NULL) {
        error("malloc");
    }

    snprintf(s, sizeof(s), "%d", x);
    return s;
}

本体にメモリを割り当て、そのような値を返します。メモリの割り当て解除をどのように処理すればよいですか? 最善のアプローチは何ですか?

4

4 に答える 4

4

メモリの割り当て解除をどのように処理すればよいですか?

気をつけて。そして、間違いなくあなたが現在しているよりも優れています。

最善のアプローチは何ですか?

最善のアプローチはfree()、メモリが不要になったときのメモリへのアクセスです。

char *str = to_str(1337);
// do stuff with `str'
free(str);

また、それsizeof()は間違っています。バッファのサイズではなく、ポインタのサイズを示します。あなたはそれを自分で追跡する必要があります。

于 2013-04-21T12:38:34.617 に答える
1

呼び出し元のコードは、次を使用してメモリを解放する必要がありますfree()

void f(int x)
{
    char *s = to_str(x);
    // ...
    free(s);
}

(ちなみに、バグがあります: inはto_strsizeof(s)指す文字列の長さではなく、ポインターのサイズですs。)

于 2013-04-21T12:36:09.703 に答える
0

最善の方法は、関数内でメモリを割り当てないことです:

 char* to_str(char *buffer, size_t buffer_size, int x);

この方法では、関数内の割り当て解除を気にする必要がなく、すべてが呼び出し側にあります。

printf("%s", to_str(x))質問にある署名で関数を作成したい場合は、メモリリークになるため、 のようなものでは使用できません。あなたはchar *str = to_str(x); printf("%s", str); free(str);良くないものを作らなければなりません...

于 2013-04-21T14:51:26.123 に答える