5

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

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

例如:

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

5 回答 5

18

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

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


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

于 2013-02-27T18:00:04.407 回答
2

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

于 2013-02-27T18:22:52.437 回答
1

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

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

于 2013-02-27T18:02:44.530 回答
1

如果您可以更改该代码,则可能更好地使用new它,所以它看起来像这样

char* str = new char;

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

于 2013-02-27T18:11:10.220 回答
0

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

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

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

通过将所有 C 代码重写malloc()为新代码来将所有 C 代码转换为 C++ 很容易在代码中引入大量错误,除非您有时间继续阅读要合并的代码以查找malloc()free()calloc()等的每个实例。 。 在上面。

只是不要混合malloc()delete混合newfree()事情破裂。

于 2013-02-27T18:00:20.590 回答