c++ - 为什么 C++ 需要对 malloc() 进行强制转换,而 C 不需要?

标签 c++ c malloc

我一直对此感到好奇——为什么在 C++ 中我必须从 malloc 中转换返回值,而不是在 C 中?

以下是 C++ 中有效的示例:

int *int_ptr = (int *)malloc(sizeof(int*));

这是 C++ 中不起作用的示例(无强制转换):

int *int_ptr = malloc(sizeof(int*));

我听说在 C 中,实际上,从 malloc() 转换输出是一个错误。

谁能评论这个话题?

最佳答案

几点:

C 允许将 void 指针隐式转换为任何其他对象指针类型。 C++ 没有。

如果您忘记包含 stdlib.h 或没有 malloc() 的声明,则在 C 中转换 malloc() 的结果将抑制有用的诊断> 在范围内。请记住,如果 C 看到没有事先声明的函数调用,它将假定该函数返回 int。如果您没有 malloc() 的声明并且您放弃了强制转换,您将得到一个诊断结果,表明您正在尝试分配不兼容的类型(int 到指针)。如果您转换结果,则会抑制诊断并且可能会出现运行时问题,因为不能保证将指针值转换为 int 并再次转换回指针会给您带来有用的结果。

如果你正在编写 C++,你应该使用 newdelete 而不是 malloc()free() 。是的,是的,是的,我听说过人们希望他们的代码同时编译为 C 和 C++ 的所有原因,但是为该语言使用正确的内存管理工具的好处超过了维护两个 IMO 版本的成本。

注意:void * 类型是在 C89 标准中添加的;早期版本的 C 有 malloc() 返回 char *,因此在这些版本中,如果您将结果分配给不同的指针类型。不过,几乎每个人都至少支持 C89 标准,因此您遇到这些旧实现之一的几率非常非常低。

关于c++ - 为什么 C++ 需要对 malloc() 进行强制转换,而 C 不需要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3477741/

相关文章:

c++ - EASTL vector-design on size() 方法

c - 重命名函数中的变量

c - 关于c99,逻辑源行的定义是什么?

c - 使用 char 时双重释放或损坏**

C内存释放?

c++ - 同时支持C++98和C++11

C++ 标准参数 : multiple calls to va_start

c++ - 强行杀死线程 C++ win32

c - 将 Linux 内核升级到最新的 64 位是否会更改 glibc?

c - 另一个malloc.c :3096: sYSMALLOc issue with pthreads and mqueue