我有一些带有 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::vector
Xeo 提到的)。由于我的经验有限,我真的没有资格在这个方向上提供建议,但是这篇文章以及搜索“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()
事情破裂。