5

私はglibを使用しています.glibに
は、自分で解放する必要がある文字列を返す関数がたくさんあります.

これらの関数を他の関数に渡すことはできますか?

例: function1は、呼び出し元のために解放する必要がある文字列を返します。 function2は、解放する必要がある文字列へのポインターを返します。

gchar *string = function2(function1("something"));
g_free (string);

function1 から返された文字列を解放するにはどうすればよいですか? これは必要ですか?

どうもありがとう、
そして私の英語でごめんなさい

4

3 に答える 3

7

はい、によって返された文字列を解放する必要がありますfunction1。これを行うには、戻り値のコピーを取得する必要があります:-

gchar* temp = function1("something");
gchar* string = function2(temp);
g_free(temp);
g_free(string);
于 2009-08-18T21:23:27.540 に答える
3

あなたが与える例では:

gchar *string = function2(function1("something"));
g_free (string);

から文字列を解放することはできませんfunction1()。これはメモリ リークです。したがって、物事を圧縮するのが良いことはわかっていますが、速度を落とす必要があります。

gchar *temp, *string;
temp = function1("something");
string = function2(temp);
g_free(temp);
temp = NULL;
g_free(string);

そうしないと、そのコードが実行されるたびに、function1()解放されることのないより多くのメモリが割り当てられ、アプリケーションが長時間実行されると、プログラムは使用可能なメモリを徐々に使い果たし始めます (割り当てられたすべてのメモリが決して解放されないためfree()) 。 .

もう 1 つの方法は、次のようにラッパーを記述することfunction2()です。

gchar *function2_wrapper(gchar *c)
{
    gchar *ret = function2(c);
    free(c);
    return ret;
}

gchar *string = function2_wrapper(function1("something"));

しかし、私の意見では、それはおそらく価値があるよりも多くの労力であり、あなたのコードを見ている人は誰でも失われる可能性があり、メモリリークがないのにメモリリークがあると考え、書き直してfree()実行時に二重エラーに遭遇し、何もありません何が起こっているかを考え、

于 2009-08-18T21:23:44.920 に答える
1

はい、@ DaveRigbyや他の人が指摘しているように、ポインタ値を解放するには、から返されたポインタ値を取得する必要があるのは事実ですfunction1()。しかし、もし大きなものがあります!

g_string_append()のようなglib関数を参照している場合は、解放しないfunction1()でください。これらの関数は、渡したものを返すためです。

あなたが持っているとしましょう

GString *s = g_string_new("foo");

そしてあなたが持っていたい"http://foo/bar"、あなたはすることができます:

s = g_string_prepend(g_string_append(s, "/bar"), "http://");
use_my_string(s);
g_string_free(s);

上記の例が最良の例ではないことは知っていますが、要点を理解していただければ幸いです。GString関数は破壊的と言えます。指定された文字列のコピーは作成されません。

于 2012-08-18T13:22:34.823 に答える