通过这样做:
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
是空指针,则不执行任何操作。否则,如果参数与早期由内存管理函数返回的指针不匹配,或者如果该空间已经被调用free
或realloc
释放,则行为未定义。
在编辑之前,您的原始代码如下:
kilobyte = free(kilobyte), NULL;
这样做的问题在于,
=
运算符的优先级高于
,
运算符,因此这个语句实际上是:
(kilobyte = free(kilobyte)), NULL;
这尝试将一个变量设置为 void
,这是不允许的。
你可能想要做的是这样:
kilobyte = (free(kilobyte), NULL);
这将释放指针并将指针设置为NULL。
正如Olaf在评论中提到的那样,与其在一行中完成所有操作,最好改为这样做:
free(kilobyte);
kilobyte = NULL;
这样做对读者来说比将代码压缩成其他人可能不理解的形式更加清晰,并且(正如您现在所看到的)出错概率更低。
错误:无法忽略void值
。 - rfreytag