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为不足以正确清理。

有两种常用的使用方法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;
}

主要区别在于,对于第二个变体,param 被设置为一个可测试的值,以表明它已被清理。对于第一个变体,您必须记住,module_param_destroy在函数返回后传递给的指针是不可用的。

你分别称它们为

module_param_destroy(module->call_param);

module_param_destroy(&module->call_param);
于 2012-11-08T08:34:02.960 回答
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 回答