类型转换malloc c++



我有一些带有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或者newfree()混在一起,否则事情就会破裂。

相关内容

  • 没有找到相关文章

最新更新