【发布时间】:2021-08-06 13:19:48
【问题描述】:
我在使用如下代码时收到此警告:
//Macro
#define FREEIF(p) if (p) { free_mem((void*)p); (p) = 0; }
//free_mem function
int free_mem(void *mem_ptr)
{
if (mem_ptr != NULL)
{
free(mem_ptr);
}
mem_ptr = NULL;
return 0;
}
//Use of Macro in my .c file with above declaration and definition of macro.
....
....
{
FREEIF(temp_ptr);
}
如果我在调用 MACRO 之前添加对“temp_ptr”的检查,例如 if (temp_ptr) {FREEIF(temp_ptr);},我不会收到此警告。
因为我已经检查了 MACRO 中的“temp_ptr”。我想知道为什么会收到此警告。
有什么见解吗?
【问题讨论】:
-
仅供参考,您无需检查传递给
free()的内容是否为NULL,因为free(NULL);被定义为什么都不做。 -
在离开函数之前将
NULL分配给free_mem内部的指针没有任何价值,无论如何,该变量都会超出范围。如果您传递双指针 (void** ptr) 并将NULL分配给*ptr,情况会发生变化。 -
您可以尝试
#define FREE(p) do { free(p); (p) = NULL; (void)(p); } while(0)并完全跳过free_mem... -
您在问题中没有明确说明消息指的是哪一行。您的代码包含两个将/可以触发此警告的地方。
FREEIF(temp_ptr);的扩展包含temp_ptr = 0;。也许您的代码在分配后没有使用temp_ptr的值。函数free_mem包含对函数参数mem_ptr中指针本地副本的赋值,该函数之后不使用也不传递给调用函数,所以这个赋值没有用。 -
就像我上面提到的,警告出现在 .c 文件的行上。当我调用 FREEIF(temp_ptr);