【问题标题】:Typecasting malloc C++ [duplicate]类型转换 malloc C++ [重复]
【发布时间】:2025-12-18 08:35:01
【问题描述】:

我有一些包含 malloc 语句的 C 代码,我想与一些 C++ 代码合并。

我想知道在 C++ 中何时以及为什么需要对 malloc 的调用进行类型转换?

例如:

char *str = (char*)malloc(strlen(argv[1]) * sizeof(char));

【问题讨论】:

标签: c++ c casting malloc


【解决方案1】:

在 C++ 中何时以及为何需要对 malloc 的调用进行类型转换?

总是在不分配给void * 时,因为void * 不会像在C 中那样隐式转换为其他指针类型。但真正的答案是你永远不应该使用@987654325首先是 C++ 中的@


我并不是建议你应该使用new 而不是malloc。现代 C++ 代码应谨慎使用new,或尽可能避免使用它。您应该隐藏所有使用 new 或使用非原始类型(如 Xeo 提到的 std::vector)。由于我的经验有限,我真的没有资格在这个方向上提供建议,但this article 以及搜索“C++ 避免新”应该会有所帮助。然后你会想要调查:

【讨论】:

  • “Ever”是如此强大..
  • @Inisheer 确实是这样,但删除它我会觉得自己要出局了。
  • @Inisheer:它不仅强大,而且是正确的做法。
  • 顺便说一句,也许你应该给出一些建议来代替(提示:std::vector 和朋友)。
  • 为什么在 C++ 中使用 malloc 如此糟糕?这原本打算成为一个纯粹的 C 程序,直到我需要合并一些 C++ 代码。将所有这些 mallocs 转换为 news 会很麻烦
【解决方案2】:

编译你的 C 库。编译您的 C++ 库。让它们在使用它们的任何“主”程序中发挥出色。关键是如果您维护一个混合代码库,您可能希望将纯 C 内容与 C++ 内容隔离开来。否则你的 C 东西会变成看起来像 C 的 C++ 东西。

【讨论】:

    【解决方案3】:

    首先,在几乎所有情况下,不要在 C++ 程序中使用malloc,而是更喜欢new,因为它会确保在需要时调用构造函数等。

    但是,如果出于遗留原因,您试图避免尽可能多的重写 - 您需要将未分配给 void* 指针的 any malloc 调用强制转换。 p>

    【讨论】:

      【解决方案4】:

      如果您可以更改该代码,最好改用new,这样它看起来像这样

      char* str = new char;

      这意味着您不需要像 C 方式那样进行任何强制转换,也不需要指定您需要多大的内存。此外,如果这是一个像std::string 这样的对象,那么当您使用malloc 时,您将不会调用构造函数,这只会保留与指针str 一起使用的内存,因此如果可以的话,最好始终将new 与C++ 一起使用同样,当您回收内存时,请始终使用适当的方式,如果您new,那么您delete,如果您malloc,您free。如果你在已经被new'd 的内存上使用free,那么你就不会调用那个对象析构函数。

      【讨论】:

        【解决方案5】:

        malloc 总是返回 void*,所以你需要转换所有内容(因为 C++ 比 C 有更强的类型检查,并且不会自动进行)

        当我使用 C 时,为了代码清晰,我也会转换所有内容。

        另外,请随时在 C++ 中继续使用 malloc(),它的存在是有充分理由的。

        通过将每个 malloc() 重写为 new 将所有 C 代码转换为 C++ 很容易在代码中引入大量错误,除非您有时间继续阅读要合并的代码以找到malloc()free()calloc()等……就可以了。

        只是不要将malloc()deletenewfree() 混用,否则会出现问题。

        【讨论】:

        • 我的方法没有使用malloc
        • “当我使用 C 时,为了代码清晰,我也会转换所有内容。” - 实际上,you cast it for ambiguity。在 C 中转换 malloc() 的返回值是一个错误
        • @speeder 好吧,关于new 部分......真正好的C++ 也不使用new
        • 在我学习 C++ 之前,我已经这样做了很多年了,因为说真的,不强制转换看看你是否得到 只是愚蠢的。除非你有疯狂的类型名称,否则它不会让你的代码更长。
        • @speeder 但是来吧,演员表而且是多余的。我宁愿阅读int *ptr = malloc(size); 而不是int *ptr = (int *)malloc(size);