是ptr = free(ptr),NULL安全吗?

时间:2016-10-02 01:47:40

标签: c variable-assignment comma-operator symmetry

我正在编写这样的代码:

#include <stdlib.h>

int main(void)
{
    void *kilobyte;
    kilobyte = malloc(1024);
    kilobyte = NULL, free(kilobyte);
    return 0;
}

对称性,这很好。但我以前从未见过其他人使用过这个成语,所以我想知道这可能实际上是不可移植/不安全的,尽管有Wikipedia引用:

  

在C和C ++编程语言中,逗号运算符(由标记表示)是一个二元运算符,它计算第一个操作数并丢弃结果,然后计算第二个操作数并返回该值(和类型)。

编辑:混淆了订单。现在它在gcc上编译而没有任何警告。

1 个答案:

答案 0 :(得分:11)

通过这样做:

kilobyte = NULL, free(kilobyte);

你有内存泄漏。

您将kilobyte设置为NULL,因此它指向的任何内存都不再在任何地方引用。然后,当您执行free(kilobyte)时,您实际上正在执行free(NULL)而不执行任何操作。

关于free(NULL),来自C standard

  

7.22.3.3 free功能

     

1

#include <stdlib.h>
void free(void *ptr);
     

2。 free函数会导致ptr指向的空间   取消分配,即可用于进一步分配。 如果   ptr是空指针,不会发生任何操作。否则,如果是参数   与先前由内存返回的指针不匹配   管理功能,或者如果空间已被解除分配   调用freerealloc时,行为未定义。

编辑前的原始代码:

kilobyte = free(kilobyte), NULL;

这个问题是=运算符的优先级高于,运算符,所以这个语句是有效的:

(kilobyte = free(kilobyte)), NULL;

这会尝试将变量设置为void,这是不允许的。

你可能要做的就是:

kilobyte = (free(kilobyte), NULL);

这将释放指针,然后将指针设置为NULL。

正如奥拉夫在评论中所提到的,不是一行中做所有事情,而是最好这样做:

free(kilobyte);
kilobyte = NULL;

读者可以更清楚地做到这一点,而不是将代码压缩成其他人可能无法理解的内容,而且(正如您现在所看到的那样)不容易出错。