如何以及何时从 malloc 投递回报

How and when to cast the return from malloc?

本文关键字:malloc 投递 回报 何时      更新时间:2023-10-16

我不确定在使用malloc时处理类型转换的正确方法。我来自目标C,其中以下内容是完全合法的:

ALuint * sources;
sources=malloc(sizeof(ALuint)*32);

但是,在C++中,编译器说"从不兼容的类型void *分配给ALuint *"。

我知道从malloc返回的内存没有被强制转换为我的特定类型,并且我知道C++对类型很严格。

现在,我可以这样做:

 sources=(ALuint*)malloc(sizeof(ALuint)*32);

但是我读到比我自己聪明得多的程序员说永远不要以这种方式投射。为什么不呢?如果没有,何时或如何进行这项工作的最佳时间或方法?

  1. 避免在C++中使用malloc
  2. 如果必须#1,则必须强制转换返回类型 malloc,以便代码编译。
  3. #2唯一的例外是目标指针是void指针。
  4. 不投射malloc的回归(有争议地)被认为是 C 语言的良好做法。

因此,在C++中,演员阵容是必要的。不过,要使用的石膏类型也很重要。绝对不应该是C型演员阵容。以上链接仅表明需要演员。


现在,我可以这样做:

sources=(ALuint*)malloc(sizeof(ALuint)*32);

但是我读到比我自己聪明得多的程序员说永远不要以这种方式投射。为什么不呢?


因为在C++ c 样式转换由标准定义,以按以下顺序映射到C++转换。第一个成功的将用于:

  1. const_cast
  2. static_cast
  3. static_cast,然后const_cast
  4. reinterpret_cast
  5. reinterpret_cast,然后const_cast

如您所见,c 样式的强制转换实际上可能会导致reinterpret_cast这是潜在的危险,因为它可以在不兼容的指针类型之间进行转换。因此,如果您必须使用malloc请使用:

sources=static_cast<ALuint*>malloc(sizeof(ALuint)*32);