类型化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
,如果你malloc
你free
。 如果你在new
的内存上使用free
,那么你就不会调用那个对象析构函数。
malloc
总是返回一个void*
所以你需要强制转换所有内容(因为C ++的类型检查比C更强,并且不会自动返回)
当我使用C时,为了清晰代码,我也会投射所有内容。
另外,随意在C ++中继续使用malloc()
,这是有充分理由的。
通过将每个malloc()
重写为new将所有C代码转换为C ++非常容易在代码中引入大量错误,除非您有时间继续阅读您要合并的代码以查找malloc()
每个实例malloc()
, free()
, calloc()
等等。
只是不要将malloc()
与delete
或new
使用free()
或者break。