为什么必须在C++中显式类型化 malloc 和 calloc?

Why is it mandatory to explicitly typecast malloc and calloc in C++?

本文关键字:malloc 类型化 calloc C++ 为什么      更新时间:2023-10-16

我最近读了一篇文章,说在C语言中没有必要显式类型化malloc和calloc,但在C++中这是强制性的。为什么会这样?谁能解释一下?

因为在 C 中,您经常需要在各种情况下使用void *。其中一些是用于回调的cookie - 当您提供指向用户数据的指针并且您无法知道该数据类型时。或者像qsort()这样的通用函数,它们必须在事先不知道其类型的情况下处理各种数据。在C++中,虽然你不需要经常使用void *,而在良好的安全代码中,你根本不需要使用它们,因为你有模板,所以你可以使用未知类型编写泛型代码,而不会进行不安全的转换。因此,C++的创建者希望刺激数据类型的正确使用,并确保当开发人员执行不安全的操作时,他/她/它/他们了解他/她/它/他们在做什么。

malloc()calloc()返回void *时,您必须在C++中显式转换它们。请注意,您不应该在C++中使用它们,而是使用operator new- 这已经返回正确的指针类型,并且您不需要强制转换。甚至在现代C++更进一步,甚至不建议直接拨打new

在 C 中,它被赋予T *tp; U *up; void *vp;,可以说vp = tp; up = vp;并最终得到一个保存T地址的U*,而无需使用任何转换运算符。 然而,C++ 的设计者希望确保如果不在此过程中至少使用一个显式转换运算符,就不会发生这样的事情。 在大多数情况下,要求在指针表示为void*的时间和实际使用时间之间使用转换运算符比在将指针转换为void*时要求转换运算符更不麻烦,这就是C++的作用。 然而,C 或 C++ 都不允许在通过转换具有实际类型的对象的地址生成的void*与用于保存没有类型的存储 blob 的地址的之间进行任何语法区分,因此无法允许后者隐式转换为任何类型(这将是有用的(,而不对前者(设计者C++不想要(。