0
gcc 4.7.2 c89

こんにちは、

私は次の機能を持っています:

void module_param_destroy(module_param_t *param)
{
    param = NULL;

    /* Stop the compiler from complaining */
    APR_UNUSED(param);
}

そして私はそれをこのように呼んでいます:

module_param_destroy(module->call_param);

パラメータparamはNULLに設定されますか。私はローカルコピーを渡しているので、ここでは何の役にも立たないと思います。

これを行う方が良いでしょうか:

void module_param_destroy(module_t *md)
{
    md->param = NULL;

    /* Stop the compiler from complaining */
    APR_UNUSED(md->param);
}

そしてそれをこのように呼びます:

module_param_destroy(md);

構造体は、mallocからグローバルにメモリを割り当てています。

提案をありがとう、

4

3 に答える 3

5

param が から取得したメモリを指している場合malloc、これを に設定してNULLも適切にクリーンアップするには不十分です。

の一般的な使用方法は 2 つありますmodule_param_destroy

void module_param_destroy(module_param_t *param)
{
    free(param);
}

また

void module_param_destroy(module_param_t **param)
{
    free(*param);
    *param = NULL;
}

主な違いは、2 番目のバリアントでは、param がクリーンアップされたことを示すためにテスト可能な値に設定されることです。module_param_destroy最初のバリアントでは、渡されたポインターは関数が戻った後は使用できないことを覚えておく必要があります。

それらをそれぞれ次のように呼び出します

module_param_destroy(module->call_param);

module_param_destroy(&module->call_param);
于 2012-11-08T08:34:02.960 に答える
2

あなたの2番目module_param_destroyは私には良さそうですが、完全なものとして、これは最初の関数の動作バージョンです:

void module_param_destroy(module_param_t **pparam)
{
    *pparam = NULL;
}

編集:ええ、他の回答で説明されているように、それはメモリを解放しないため、これはmallocedメモリへの最後のポインタです。free設定する前にNULL...

于 2012-11-08T08:31:22.657 に答える
2

最初のバージョンでは、ポインターのローカルコピーに割り当てているため、ポインターは変更されません。代わりに、ポインターへのポインターを使用して割り当てます。

void module_param_destroy(module_param_t **param)
{
    *param = NULL;    
}

そして、次のように呼び出します。

module_param_destroy(&module->call_param);
于 2012-11-08T08:31:43.340 に答える