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明显,因为你认为pTYPe而不是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++

    下一篇: Should I explicitly cast malloc()'s return value?