为什么必须在C++中显式类型化 malloc 和 calloc?
Why is it mandatory to explicitly typecast malloc and calloc in C++?
我最近读了一篇文章,说在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++不想要(。
- 如果没有malloc,链表实现将失败
- malloc() 可能出现内存泄漏
- Cuda C++:设备上的Malloc类,并用来自主机的数据填充它
- 当我尝试加载内核模块时,如何修复C++中的这个 malloc() 错误?
- 在C++中创建队列 - 什么是 malloc 错误?
- 如何在 malloc 内存中初始化非 POD 数据
- 使用 malloc() 时出现意外大小
- C++:在被本地字符串捕获后释放或销毁 malloc'd char *?
- 错误:malloc:对象 0x7f9edf504080 的 *** 错误:未分配正在释放的指针
- 将 malloc 替换为数组
- SIGSEGV on Boost UDP 套接字关闭 - tcache_get at malloc.c.
- Malloc 在使用线程并行化 SSH 调用时存在问题
- 如何将新更改为 malloc?
- 不能对类型化模板使用 STL 函数
- 将 malloc 转换为新的正确方法
- Malloc void return char 数组有时不起作用(Terry Davis 对 C++);
- 如何通过 malloc 为队列数组分配内存?
- 正在调试 malloc():新内存损坏
- 我怎样才能代替使用新的使用malloc翻译
- 为什么必须在C++中显式类型化 malloc 和 calloc?