类型化malloc C ++

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

我想知道什么时候以及为什么要在C ++中调用malloc neccessary?

例如:

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

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

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


我并不是说你应该使用new而不是malloc 。 现代C ++代码应该谨慎使用new ,或者尽可能完全避免使用它。 你应该隐藏所有new使用或使用非原始类型(比如Xeo提到的std::vector )。 由于我的经验有限,我不太有资格在这方面给出建议,但这篇文章以及搜索“C ++避免新的”应该有所帮助。 然后你会想看看:

  • 的std :: alocator
  • 智能指针

编译C库。 编译C ++库。 让它们在任何使用它们的“主要”程序中都很好玩。 关键是如果你维护一个混合的代码库,你可能想要从C ++的东西中分离出纯C的东西。 否则你的C东西变成只看起来像C的C ++东西。

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

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

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

char* str = new char;

这意味着您不需要像C方式那样进行任何转换,也不需要指定所需的内存量。 此外,如果这是一个像std::string这样的对象,那么当你使用malloc时你不会调用构造malloc ,这只是保留了与指针str一起使用的内存,所以最好总是使用new与C ++,如果你还可以回收内存总是使用适当的方式,如果你是new那么你delete ,如果你mallocfree 。 如果你在new的内存上使用free ,那么你就不会调用那个对象析构函数。

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

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

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

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

只是不要将malloc()deletenew使用free()或者break。