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

Is ptr = free(ptr), NULL safe?

我正在写这样的代码:

#include <stdlib.h>

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

为了对称,这很好。但我以前从未见过其他人使用过这个习语,所以我想知道这是否真的是 unportable/unsafe,尽管有这个 Wikipedia 引用:

In the C and C++ programming languages, the comma operator (represented by the token ,) is a binary operator that evaluates its first operand and discards the result, and then evaluates the second operand and returns this value (and type).


编辑:打乱顺序。现在它在 gcc 上编译,没有任何警告。

通过这样做:

kilobyte = NULL, free(kilobyte);

你有内存泄漏。

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

关于 free(NULL),来自 C standard

7.22.3.3 The free function

1.

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

2. The free function causes the space pointed to by ptr to be deallocated, that is, made available for further allocation. If ptr is a null pointer, no action occurs. Otherwise, if the argument does not match a pointer earlier returned by a memory management function, or if the space has been deallocated by a call to free or realloc, the behavior is undefined.

关于您编辑前的原始代码:

kilobyte = free(kilobyte), NULL;

问题在于 = 运算符的优先级高于 , 运算符,因此该语句实际上是:

(kilobyte = free(kilobyte)), NULL;

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

您可能想要做的是:

kilobyte = (free(kilobyte), NULL);

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

正如 Olaf 在评论中提到的,与其在一行中完成所有操作,不如这样做:

free(kilobyte);
kilobyte = NULL;

这样做对 reader 来说比将代码压缩成其他人可能无法理解的内容更清晰,而且(如您现在所见)更不容易出错。