指针 ptr = free(ptr),是否安全?

5

我正在编写这样的代码:

#include <stdlib.h>

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

为了对称,这很好。但我从未见过其他人使用这个习语,所以我想知道尽管维基百科引用如下:

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


编辑:顺序混乱。现在使用gcc编译时不会出现任何警告。


嗯,是的,但既然它被丢弃了...我不知道这是否重要。 - user2933244
顺带一提,引用有误,请查阅标准!不要使用非权威资源来解决语言问题。 - too honest for this site
@tkausl:这是关于C++的,一种不同的语言。 - too honest for this site
1
如果您尝试编译它,将会得到以下结果:错误:无法忽略void值 - rfreytag
1
在调试器中运行你的“完美”代码! - too honest for this site
显示剩余13条评论
1个回答

10

通过这样做:

kilobyte = NULL, free(kilobyte);

你的程序存在内存泄漏。

你将 kilobyte 设为了 NULL,所以它曾经指向的内存没有被任何变量引用。当你执行 free(kilobyte) 时,实际上相当于执行了 free(NULL),这不会释放任何内存。

至于free(NULL),请参考C标准

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。

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

free(kilobyte);
kilobyte = NULL;

这样做对读者来说比将代码压缩成其他人可能不理解的形式更加清晰,并且(正如您现在所看到的)出错概率更低。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接