首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更改空闲预处理器定义,以便也将null放入指针

更改空闲预处理器定义,以便也将null放入指针
EN

Stack Overflow用户
提问于 2020-09-24 17:53:12
回答 3查看 64关注 0票数 0

我有一个预处理器定义:

代码语言:javascript
复制
#include "stdio.h"
#define FREE(ptr) free(ptr)

我想知道把它改成:

代码语言:javascript
复制
#include "stdio.h"
#define FREE(ptr) free(ptr); \
        (ptr) = null;

为了代码安全。

我认为这是因为自由返回的是空的,所以它不能像that question中显示的那样被链式链接,所以它将是安全的,但我不确定。

EN

回答 3

Stack Overflow用户

发布于 2020-09-24 17:58:41

您的原文缺少分号,在执行控制语句(ifelsewhilefor...)后,这种用法将不起作用。如果不在块语句{ ... }中。

由于free不返回值,为了获得最大的兼容性(函数指针使用或在逗号运算符中使用除外)。释放函数的返回值,递增对free的调用和其他可疑的技巧...)您可以使用包装到do { } while (0)中的非常常见的技巧。即使在嵌套的if...else中,do { } while (0)也会接受以下分号,并且工作方式类似。

因此:

代码语言:javascript
复制
#define FREE(ptr) do { free(ptr); ptr = 0; } while (0)
票数 2
EN

Stack Overflow用户

发布于 2020-09-24 17:58:01

失败的原因至少有3种:

代码语言:javascript
复制
#define FREE(ptr) free(ptr) \
    (ptr) = null;

未定义null

没有绑在一起。考虑一下

代码语言:javascript
复制
if (test) FREE(ptr);

就像

代码语言:javascript
复制
if (test) free(ptr);
ptr = null;

双重评价

代码语言:javascript
复制
FREE(foo());

就像

代码语言:javascript
复制
free(foo());
foo() = null;
票数 1
EN

Stack Overflow用户

发布于 2020-09-24 17:58:24

你可能想要这个:

代码语言:javascript
复制
#define FREE(ptr) do {free(ptr); \
        (ptr) = NULL;} while (0)

而不是这样:

代码语言:javascript
复制
#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);
...

此代码片段应输出类似以下内容的内容:

代码语言:javascript
复制
a = 01bb95d9
a = 00000000

有关do... while(0)内容的更多信息,请阅读this

一个更简洁的解决方案是将其放入如下函数中:

代码语言:javascript
复制
void FREE(void **ptr)
{
  free(*ptr);
  *ptr = NULL;
}

然后这样叫它:

代码语言:javascript
复制
int *a = malloc(10);
FREE(&a);
// a is NULL here
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64043947

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档