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 来说比将代码压缩成其他人可能无法理解的内容更清晰,而且(如您现在所见)更不容易出错。
我正在写这样的代码:
#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
function1.
#include <stdlib.h> void free(void *ptr);
2. The
free
function causes the space pointed to byptr
to be deallocated, that is, made available for further allocation. Ifptr
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 tofree
orrealloc
, the behavior is undefined.
关于您编辑前的原始代码:
kilobyte = free(kilobyte), NULL;
问题在于 =
运算符的优先级高于 ,
运算符,因此该语句实际上是:
(kilobyte = free(kilobyte)), NULL;
这试图将变量设置为 void
,这是不允许的。
您可能想要做的是:
kilobyte = (free(kilobyte), NULL);
这会释放指针,然后将指针设置为 NULL。
正如 Olaf 在评论中提到的,与其在一行中完成所有操作,不如这样做:
free(kilobyte);
kilobyte = NULL;
这样做对 reader 来说比将代码压缩成其他人可能无法理解的内容更清晰,而且(如您现在所见)更不容易出错。