我正在研究一个旧的代码库,几乎每次调用free()都会在其参数上使用强制转换.例如,
free((float *)velocity);
free((float *)acceleration);
free((char *)label);
Run Code Online (Sandbox Code Playgroud)
其中每个指针都是相应的(和匹配的)类型.我完全没有理由这样做.这是非常古老的代码,所以我想知道它是否是K&R的东西.如果是这样,我实际上希望支持可能需要这个的旧编译器,所以我不想删除它们.
使用这些演员阵容有技术原因吗?我甚至没有看到使用它们的实用理由.在释放数据类型之前提醒自己有什么意义?
编辑:这个问题不是另一个问题的重复.另一个问题是这个问题的一个特例,如果亲密的选民能够阅读所有的答案,我认为这是显而易见的.
Colophon:我给出了"常量答案"的核对标记,因为这可能是为什么需要这样做的真正原因; 然而,关于它是一个ANSI C之前的习惯(至少在一些程序员中)的答案似乎是它在我的情况下使用的原因.很多人在这里有很多好处.感谢您的贡献.
我想询问以下案例:
char *temp;
temp = malloc(10);
Run Code Online (Sandbox Code Playgroud)
由于返回类型malloc
是void*
,在被分配给temp之前,是否会malloc
被隐式转换为char*
类型返回的指针?标准在这方面说了什么?
如果我们的指针变量是某种结构类型,例如:
struct node *temp;
temp = (struct node *)malloc(sizeof(struct node));
Run Code Online (Sandbox Code Playgroud)
如果我们将内存分配给temp而不struct node*
将其强制转换为类型,是否会将其隐式转换为struct node*
类型,还是必须将其显式转换为struct node*
类型?
将C++ 11代码连接到一些C回调,我必须传递const char * const *
,即一个字符串数组.这是我的代码的简化版本:
int main(int,char**){
const int cnt = 10;
const char * const * names =
static_cast<const char * const *>(malloc( sizeof(char*) * cnt));
//... allocating names[0], etc. coming soon ...
the_c_function(names);
free(names);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
所以我研究了如何malloc
在C++中使用,但我坚持free
,因为它告诉我:"从'const void*'无效转换为'void*'[-fpermissive]"
我的第一反应是"呃?你为什么关心,所有你需要做的就是释放指针." 第二反应是把它扔掉.但这会被编译器拒绝:
free( const_cast<void*>(names) );
Run Code Online (Sandbox Code Playgroud)
这也是如此:
free( static_cast<void*>(acctnames) );
Run Code Online (Sandbox Code Playgroud)
例如"从类型'const char*const*'中的static static_cast'到'void*'类型".
什么做的工作是一个很好的"OLEÇ投:
free( (void*)(acctnames) );
Run Code Online (Sandbox Code Playgroud)
那是安全的,还是我在这里遗漏了什么?(valgrind
告诉我"所有堆块都被释放 - 没有泄漏可能",这是一种安慰!)
PS在Linux上使用g ++ 4.8.1.
更新:解释为什么free()
想要一个非常量指针在这里:无法释放C中的常量指针
(虽然我发现barak …