C ++
我对这个主题的回答有了一个评论:
函数调用中的malloc似乎在返回时被释放?
总之,我有这样的代码:
int * somefunc (void)
{
int * temp = (int*) malloc (sizeof (int));
temp[0] = 0;
return temp;
}
我得到了这个评论:
我可以说,请不要施加malloc的返回值? 这不是必需的,可以隐藏错误。
我同意C中不需要强制转换。它在C ++中是强制性的,所以我通常添加它们以防万一我必须在C ++中移植代码。
但是,我想知道如何转换可以隐藏错误。 有任何想法吗?
编辑:
似乎双方都有非常好的和有效的论点。 感谢发布,伙计们。
我似乎适合我发表了一个答案,因为我离开了评论:P
基本上,如果你忘记包含stdlib.h
,编译器会认为malloc
返回一个int
。 如果没有投射,您会收到警告。 通过铸造你不会。
所以通过施放你什么也得不到,并冒着压制合法警告的风险。
有很多关于这方面的文章,快速谷歌搜索将会提出更详细的解释。
编辑
有人认为
TYPE * p;
p = (TYPE *)malloc(n*sizeof(TYPE));
当你意外地不分配足够的内存时,它TYPe
明显,因为你认为p
是TYPe
而不是TYPE
,所以我们应该使用malloc,因为这种方法的优点会覆盖意外抑制编译器警告的较小代价。
我想指出2件事情:
p = malloc(sizeof(*p)*n);
始终确保您的malloc具有适当的空间 p
的类型,则需要在3个地方进行更改:一次在声明中,一次在malloc
,一次在演员表中。 总而言之,我个人认为不需要投射malloc
的返回值,这当然不是最佳实践。
这个问题被标记为C和C ++,所以它至少有两个答案,恕我直言:
C
啊哈......做任何你想做的事。
我相信上面给出的原因“如果你不包括”stdlib“那么你不会得到一个警告”是不是一个有效的,因为不应该依赖这种黑客不要忘记包含标题。
真正的原因可能会导致你不写剧本,C编译器已经默默地将一个void *
转换成你想要的任何指针类型,所以,自己做这些操作是过度的,没用的。
如果你想有类型安全性,你可以切换到C ++或编写自己的包装函数,如:
int * malloc_Int(size_t p_iSize) /* number of ints wanted */
{
return malloc(sizeof(int) * p_iSize) ;
}
C ++
有时,即使在C ++中,您也必须从malloc / realloc / free utils中获利。 然后你必须施放。 但你已经知道了。 使用static_cast <>()会比C风格的转换更好。
在C中,您可以通过模板来覆盖malloc(以及realloc等)以实现类型安全性:
template <typename T>
T * myMalloc(const size_t p_iSize)
{
return static_cast<T *>(malloc(sizeof(T) * p_iSize)) ;
}
这将用于:
int * p = myMalloc<int>(25) ;
free(p) ;
MyStruct * p2 = myMalloc<MyStruct>(12) ;
free(p2) ;
和下面的代码:
// error: cannot convert ‘int*’ to ‘short int*’ in initialization
short * p = myMalloc<int>(25) ;
free(p) ;
不会编译,所以没问题。
总而言之,在纯粹的C ++中,如果有人在您的代码中发现多个C malloc,您现在没有任何理由...... :-)
C + C ++交叉
有时候,你想生成的代码可以在C和C ++中编译(出于任何原因......是不是C ++ extern "C" {}
块的重点?)。 在这种情况下,C ++要求进行强制转换,但C不会理解static_cast关键字,因此解决方案是C风格强制转换(由于这种原因,C ++仍然是合法的)。
请注意,即使编写纯C代码,使用C ++编译器进行编译也会带来更多的警告和错误(例如,尝试使用函数而不声明它首先不会编译,与上面提到的错误不同)。
因此,为了安全起见,编写可以用C ++干净地编译的代码,研究并更正警告,然后使用C编译器生成最终的二进制文件。 这意味着,再次以C风格的演员阵容来演员阵容。
它可以引入的一个可能的错误是,如果您正在使用C(而不是C ++)在64位系统上进行编译。
基本上,如果您忘记包含stdlib.h
,则默认的int规则将应用。 因此编译器会高兴地认为malloc
具有int malloc();
的原型int malloc();
在许多64位系统上,int为32位,指针为64位。
呃哦,值被截断,你只能得到指针的低32位! 现在,如果你施放malloc
的返回值,这个错误就会被强制隐藏。 但是,如果你不这样做,你会得到一个错误(“无法将int转换为T *”)。
这当然不适用于C ++,原因有二。 首先,它没有默认的int规则,其次它需要强制转换。
总而言之,无论如何,你应该只是新的c ++代码:-P。
链接地址: http://www.djcxy.com/p/28351.html上一篇: c++