【发布时间】:2025-12-18 08:35:01
【问题描述】:
我有一些包含 malloc 语句的 C 代码,我想与一些 C++ 代码合并。
我想知道在 C++ 中何时以及为什么需要对 malloc 的调用进行类型转换?
例如:
char *str = (char*)malloc(strlen(argv[1]) * sizeof(char));
【问题讨论】:
-
我已经看到了这个问题,但它没有回答为什么它在 C++ 中是必要的
我有一些包含 malloc 语句的 C 代码,我想与一些 C++ 代码合并。
我想知道在 C++ 中何时以及为什么需要对 malloc 的调用进行类型转换?
例如:
char *str = (char*)malloc(strlen(argv[1]) * sizeof(char));
【问题讨论】:
在 C++ 中何时以及为何需要对 malloc 的调用进行类型转换?
总是在不分配给void * 时,因为void * 不会像在C 中那样隐式转换为其他指针类型。但真正的答案是你永远不应该使用@987654325首先是 C++ 中的@。
我并不是建议你应该使用new 而不是malloc。现代 C++ 代码应谨慎使用new,或尽可能避免使用它。您应该隐藏所有使用 new 或使用非原始类型(如 Xeo 提到的 std::vector)。由于我的经验有限,我真的没有资格在这个方向上提供建议,但this article 以及搜索“C++ 避免新”应该会有所帮助。然后你会想要调查:
【讨论】:
std::vector 和朋友)。
mallocs 转换为 news 会很麻烦
编译你的 C 库。编译您的 C++ 库。让它们在使用它们的任何“主”程序中发挥出色。关键是如果您维护一个混合代码库,您可能希望将纯 C 内容与 C++ 内容隔离开来。否则你的 C 东西会变成看起来像 C 的 C++ 东西。
【讨论】:
首先,在几乎所有情况下,不要在 C++ 程序中使用malloc,而是更喜欢new,因为它会确保在需要时调用构造函数等。
但是,如果出于遗留原因,您试图避免尽可能多的重写 - 您需要将未分配给 void* 指针的 any malloc 调用强制转换。 p>
【讨论】:
如果您可以更改该代码,最好改用new,这样它看起来像这样
char* str = new char;
这意味着您不需要像 C 方式那样进行任何强制转换,也不需要指定您需要多大的内存。此外,如果这是一个像std::string 这样的对象,那么当您使用malloc 时,您将不会调用构造函数,这只会保留与指针str 一起使用的内存,因此如果可以的话,最好始终将new 与C++ 一起使用同样,当您回收内存时,请始终使用适当的方式,如果您new,那么您delete,如果您malloc,您free。如果你在已经被new'd 的内存上使用free,那么你就不会调用那个对象析构函数。
【讨论】:
malloc 总是返回 void*,所以你需要转换所有内容(因为 C++ 比 C 有更强的类型检查,并且不会自动进行)
当我使用 C 时,为了代码清晰,我也会转换所有内容。
另外,请随时在 C++ 中继续使用 malloc(),它的存在是有充分理由的。
通过将每个 malloc() 重写为 new 将所有 C 代码转换为 C++ 很容易在代码中引入大量错误,除非您有时间继续阅读要合并的代码以找到malloc()、free()、calloc()等……就可以了。
只是不要将malloc() 与delete 或new 与free() 混用,否则会出现问题。
【讨论】:
malloc() 的返回值是一个错误。
new 部分......真正好的C++ 也不使用new
int *ptr = malloc(size); 而不是int *ptr = (int *)malloc(size);。