我有一些带有malloc语句的C代码,我希望与某些C ++代码合并。
我想知道何时以及为什么要在C ++中对malloc必要进行类型转换?
例如:
char *str = (char*)malloc(strlen(argv[1]) * sizeof(char));
答案 0 :(得分:17)
何时以及为什么要在C ++中对malloc neccessary进行类型转换?
总是当没有分配给void *
时,由于void *
没有隐式转换为其他指针类型,它在C中的方式。但真正的答案是你不应该首先在C ++中使用malloc
。
我不建议您使用new
代替malloc
。现代C ++代码应谨慎使用new
,或者尽可能完全避免使用new
。您应该隐藏std::vector
的所有使用或使用非原始类型(如Xeo提到的{{1}})。由于我的经验有限,我不太有资格在这方面给出建议,但是this article以及搜索“C ++避免新的”应该有所帮助。然后你会想看看:
答案 1 :(得分:2)
编译C库。编译C ++库。让它们在任何使用它们的“主要”程序中都很好玩。关键是如果你维护一个混合的代码库,你可能想要从C ++的东西中分离出纯C的东西。否则你的C东西会变成只看起来像C的C ++东西。
答案 2 :(得分:1)
首先,几乎在所有情况下都不要在C ++程序中使用malloc
,而是更喜欢new
,因为它会确保在需要时调用构造函数等。
但是,如果出于遗产原因,您尝试避免尽可能多的重写 - 您需要投放未分配给malloc
的任何 void*
来电指针。
答案 3 :(得分:1)
如果您可以更改该代码,可能最好使用new
代替它,所以它看起来像这样
char* str = new char;
这意味着您不需要像C方式那样进行任何转换,也不需要指定所需内存的大小。此外,如果这是一个像std::string
这样的对象,那么当你使用malloc
时你就不会调用构造函数,这只会保留用于指针str
的内存,所以最好总是使用{{ 1}}使用C ++,如果你也可以在回收内存时总是使用适当的方式,如果你是new
,那么你是new
,如果你是delete
你malloc
。如果对free
'的内存使用free
,则不会调用该对象析构函数。
答案 4 :(得分:0)
malloc
总是返回一个void*
所以你需要强制转换所有内容(因为C ++的类型检查比C更强,并且不会自动生成)
当我使用C时,为了清晰代码,我也会投射所有内容。
另外,随意在C ++中继续使用malloc()
,这是有充分理由的。
通过将每个malloc()
重写为new将所有C代码转换为C ++非常容易在代码中引入大量错误,除非您有时间继续阅读您要合并的代码以查找每个代码<{1}},malloc()
,free()
等的实例。
请不要将calloc()
与malloc()
或delete
混合new
或其他内容。