我正在将许多Unix的C程序转换到Linux上,而这个free()语法引起了我的注意:
free((char *) area );
这个和 free( area );
有什么区别呢?
free
的签名为:
void free(void *ptr);
那么如果area
是由malloc
或其类似函数返回的指针类型,那么在free((char *) area );
中的转换是无意义的。
除非......如果代码真的非常古老,也就是在ANSI C引入void *
作为通用指针之前。在那个古老的时代,char *
被用作通用指针。
area
声明为 intptr_t
,这将把非指针类型转换为指针类型并允许释放它。area
已经是指针类型,则任何在过去25年内编写的C代码都不会出现这种情况。free()
在标准中的签名是错误的。它应该是void free(const void *);
才能真正正确。这意味着当你想要释放一个const *
时,必须将其上转型而不会收到警告。
这里有Linus Torvald关于为什么free()
应该采用const *
的抱怨。
编辑:争议的根本想法源于一般人认为const
对指针所指向的内存有任何影响,即指针指向只读内存。这显然是错误的。 const
限定符是指针的属性,而不是它所指向的东西。这是一个重要的区别。
malloc
返回的是非const类型,所以你需要在malloc
和free
之间进行强制类型转换。其次,const
表示一种合同,意味着您不会修改内存指针指向的内容。释放该内存将违反该约定。我无法想出任何支持它的论点,因此我会对支持const的论点感兴趣。 - MicroVirusp
修改该对象,则 free(p)
违反了该规定:结束对象的生命周期是一种(严重的!)修改。 - R.. GitHub STOP HELPING ICEfree
后没有对象存在,因此没有有效的对象可以进行比较。他的发泄只是如此而已,我不会因为来源而过分解读他的发泄。我认识一个叫 Sutter 的人,他认为 VC++ 是最好的 C++ 编译器。对啊,只是因为你聪明并不意味着你是正确的。 - WhozCraig{ const int a = 0; }
。这是明确定义的,但会结束一个被定义为“const”的对象的生命周期。修改一个被定义为“const”的对象是不允许的,所以这个块能够有效的唯一方式就是结束一个对象的生命周期不算作修改。 - user743382