Typecasting malloc C ++

时间:2013-02-27 17:57:38

标签: c++ c casting malloc

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

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

例如:

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

5 个答案:

答案 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,如果你是deletemalloc。如果对free'的内存使用free,则不会调用该对象析构函数。

答案 4 :(得分:0)

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

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

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

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

请不要将calloc()malloc()delete混合new或其他内容。