我有一些带有 malloc 语句的 C 代码,我想与一些 C++ 代码合并。
我想知道何时以及为什么在 C++ 中需要对 malloc 的调用进行类型转换?
例如:
char *str = (char*)malloc(strlen(argv[1]) * sizeof(char));
何时以及为什么在 C++ 中需要对 malloc 的调用进行类型转换?
总是在不分配给 a 时void *,因为void *它不会像在 C 中那样隐式转换为其他指针类型。但真正的答案是你不应该首先malloc在 C++中使用。
我不是建议你应该使用new而不是malloc. 现代 C++ 代码应new谨慎使用,或尽可能避免使用。您应该隐藏所有使用new或使用非原始类型(如std::vectorXeo 提到的)。由于我的经验有限,我真的没有资格在这个方向上提供建议,但是这篇文章以及搜索“C++ 避免新”应该会有所帮助。然后你会想要调查:
编译你的 C 库。编译您的 C++ 库。让它们在使用它们的任何“主”程序中发挥出色。重点是,如果您维护混合代码库,您可能希望将纯 C 内容与 C++ 内容隔离开来。否则,您的 C 内容会变成仅看起来像 C 的 C++ 内容。
首先,几乎在所有情况下都不要malloc在 C++ 程序中使用,而是更喜欢它,new因为它会确保在需要时调用构造函数等。
但是,如果出于遗留原因您试图避免尽可能多的重写 - 您将需要强制转换任何 malloc未分配给void*指针的调用。
如果您可以更改该代码,则可能更好地使用new它,所以它看起来像这样
char* str = new char;
这意味着您不需要像 C 方式那样进行任何强制转换,也不需要指定需要多大的内存。此外,如果这是一个像 a 这样的对象,std::string那么您在使用时不会调用构造函数malloc,这只会保留与指针一起使用的内存,str因此最好始终new与 C++ 一起使用,如果您也可以在回收内存时始终使用适当的方式,如果你new那么你delete,如果你malloc你free。如果您free在已被new'd 的内存上使用,那么您将不会调用该对象的析构函数。
malloc总是返回 avoid*所以你需要强制转换所有内容(因为 C++ 比 C 有更强的类型检查,并且不会自动进行)
当我使用 C 时,为了代码清晰,我也会转换所有内容。
此外,请随时malloc()在 C++ 中继续使用,这是有充分理由的。
通过将所有 C 代码重写malloc()为新代码来将所有 C 代码转换为 C++ 很容易在代码中引入大量错误,除非您有时间继续阅读要合并的代码以查找malloc()、free()、calloc()等的每个实例。 。 在上面。
只是不要混合malloc()或delete混合new或free()事情破裂。