在下面的代码中,是否可能导致一些内存泄漏?
reference-ril.c
static void requestRadioPower(void *data, size_t datalen, RIL_Token t)
{
....
ATResponse *p_response = NULL;
....
err = at_send_command(cmd, &p_response); // it's a memory leakage or not ?
....
at_response_free(p_response);
....
}
在其他功能中:
static void requestOrSendPDPContextList(RIL_Token *t)
{
ATResponse *p_response;
....
err = at_send_command_multiline ("AT+CGACT?", "+CGACT:", &p_response);
// it's a leakage or not ?
....
at_response_free(p_response);
....
}
实际上,在某些情况下,在调用at_response_free(p_response)之前会返回这些函数。 我想我们首先将ATResponse * p_response设置为NULL,对吗? 将指针设置为NULL是个好主意吗?
答案 0 :(得分:3)
取决于:
at_send_command_multiline
和at_send_command
查看各自最后一个参数(&p_response
)指向的值,则应将它们设置为可预测的值。这可能意味着您将p_response
设置为NULL
。如果函数为指针分配内存而不查看初始值,那么你没问题。要回答您的特定问题,函数中声明的变量(除非声明为static
)没有默认值。at_send_command*
函数总是为最后一个参数分配内存,那么必须释放内存。如果他们仅在成功的情况下分配,那么您必须仅在成功的情况下释放。一个简单的规则是,对于每个malloc()
或calloc()
,应该有free()
。 (realloc()
稍微改变一下,但你现在不需要担心它。)换句话说,您需要查看at_send_command*
函数的文档,或查看函数的定义以完全回答您的问题。
答案 1 :(得分:1)
将指针设置为null当然是个好主意;但两种情况都不是内存泄漏。
C中指针的初始值是垃圾,任何未初始化的变量的初始值也是如此。 (这是因为效率,或者我被告知,需要牢记。)