我有一些带有malloc语句的C代码,我想将它们与一些c++代码合并。
我想知道何时以及为什么在c++中需要对malloc进行类型转换?
例如: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
,因为它将确保在需要时调用构造函数,等等。
然而,如果出于遗留原因,您试图避免尽可能多的重写-您将需要强制转换任何 malloc
调用,而不是分配给void*
指针。
如果你可以更改代码,最好使用new
,所以它看起来像这样
char* str = new char;
这意味着你不需要像C那样做任何类型转换,也不需要指定你需要多大的内存。同样,如果这是一个像std::string
这样的对象,那么当你使用malloc
时,你将不会调用构造函数,这仅仅是为指针str
保留内存,所以最好总是使用new
和c++,如果你可以,当你回收内存时,总是使用适当的方式,如果你使用new
,那么你使用delete
,如果你使用malloc
,你使用free
。如果你在已经是new
'd的内存上使用free
,那么你将不会调用该对象的析构函数。
malloc
总是返回void*
,所以您需要强制转换所有内容(因为c++具有比C更强的类型检查,并且不会自动执行)
当我使用C时,为了代码清晰,我也强制转换所有内容。
另外,在c++中继续使用malloc()
也是有原因的。
通过重写每一个malloc()
来转换所有的C代码到c++是很容易在你的代码中引入很多错误的,除非你有时间继续阅读你正在合并的代码,以找到malloc()
, free()
, calloc()
等的每一个实例…。
不要把malloc()
和delete
或者new
和free()
混在一起,否则事情就会破裂。