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全局分配了内存。
非常感谢任何建议,
答案 0 :(得分: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);
答案 1 :(得分:2)
你的第二个module_param_destroy
看起来不错,但是对于完整版,这是你的第一个函数的工作版本:
void module_param_destroy(module_param_t **pparam)
{
*pparam = NULL;
}
编辑:是的,正如在另一个答案中所解释的那样,不释放任何内存,因此这是指向malloc
内存的最后一个指针,在设置它之前你必须free
它到NULL
...
答案 2 :(得分:2)
第一个版本不会更改指针,因为您要分配指针的本地副本,而是使用指向指针的指针来指定:
void module_param_destroy(module_param_t **param)
{
*param = NULL;
}
并称之为:
module_param_destroy(&module->call_param);