我有一个预处理器定义:
#include "stdio.h"
#define FREE(ptr) free(ptr)我想知道把它改成:
#include "stdio.h"
#define FREE(ptr) free(ptr); \
(ptr) = null;为了代码安全。
我认为这是因为自由返回的是空的,所以它不能像that question中显示的那样被链式链接,所以它将是安全的,但我不确定。
发布于 2020-09-24 17:58:41
您的原文缺少分号,在执行控制语句(if、else、while、for...)后,这种用法将不起作用。如果不在块语句{ ... }中。
由于free不返回值,为了获得最大的兼容性(函数指针使用或在逗号运算符中使用除外)。释放函数的返回值,递增对free的调用和其他可疑的技巧...)您可以使用包装到do { } while (0)中的非常常见的技巧。即使在嵌套的if...else中,do { } while (0)也会接受以下分号,并且工作方式类似。
因此:
#define FREE(ptr) do { free(ptr); ptr = 0; } while (0)发布于 2020-09-24 17:58:01
失败的原因至少有3种:
#define FREE(ptr) free(ptr) \
(ptr) = null;未定义null。
没有绑在一起。考虑一下
if (test) FREE(ptr);就像
if (test) free(ptr);
ptr = null;双重评价
FREE(foo());就像
free(foo());
foo() = null;发布于 2020-09-24 17:58:24
你可能想要这个:
#define FREE(ptr) do {free(ptr); \
(ptr) = NULL;} while (0)而不是这样:
#define FREE(ptr) free(ptr) \
(ptr) = null;
...
int* a = malloc(10);
printf(" a = %p\n", (void*)a);
FREE(a);
printf(" a = %p\n", (void*)a);
...此代码片段应输出类似以下内容的内容:
a = 01bb95d9
a = 00000000有关do... while(0)内容的更多信息,请阅读this。
一个更简洁的解决方案是将其放入如下函数中:
void FREE(void **ptr)
{
free(*ptr);
*ptr = NULL;
}然后这样叫它:
int *a = malloc(10);
FREE(&a);
// a is NULL herehttps://stackoverflow.com/questions/64043947
复制相似问题