0

我不确定在使用malloc. 我来自Objective C,其中以下内容完全合法:

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

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

我知道从返回的内存malloc不是我的特定类型,而且我知道 C++ 对类型很严格。

现在,我可以这样做:

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

但是我读过比我更聪明的编码员说永远不要以这种方式投射。为什么不?如果不是,那么何时或如何是进行这项工作的最佳时间或方法?

4

1 回答 1

3
  1. 避免malloc在 C++ 中使用。
  2. 如果必须#1,您必须强制转换代码的返回类型malloc才能编译
  3. 唯一的例外#2是您的目标指针是void指针
  4. 不强制返回mallocis (有争议地)被认为是 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. 重新解释_cast,然后是 const_cast

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

sources=static_cast<ALuint*>malloc(sizeof(ALuint)*32);
于 2013-02-02T04:56:33.610 回答