std::malloc/calloc/realloc/free 与纯 C 的 malloc/calloc/realloc/free 有什么不同吗

Are std::malloc/calloc/realloc/free any different from pure C's malloc/calloc/realloc/free

提问人:simd 提问时间:9/8/2023 更新时间:9/8/2023 访问量:152

问:

为什么 C++ 需要自己的 C 标准库 malloc/calloc/realloc/free 函数版本?它们看起来都完全相同。我应该更喜欢在 C++ 中使用 std:: 版本吗?他们的行为会有所不同吗?

C++ C 马洛克

评论

10赞 Remy Lebeau 9/8/2023
它们是相同的,C++ 只是将 C 函数放入 C++ 命名空间中。虽然,你真的不应该在 C++ 中使用它们,但在 C++ 中有更好/更安全的方法来管理内存。std
0赞 463035818_is_not_an_ai 9/8/2023
您应该阅读命名空间及其使用原因。这基本上是唯一的区别。
0赞 tadman 9/8/2023
在 C++ 中,除了编写与 C 库接口的代码时,您不应该需要它们,即使如此,也要有选择地使用它们。 并且是分配和释放内存的 C++ 方式。newdelete
1赞 user4581301 9/8/2023
即使在 C++ 中,您也会时不时地发现自己编写了一些低级代码来处理管道。这时,朋友就从工具箱里出来了。某些函数的版本略有不同,例如,有一个漂亮的模板包装器,最终调用 .不过,没有看到这样的事情。std::mallocstdstd::powpowstd::malloc
1赞 user4581301 9/8/2023
在库实现附带的以 c 为前缀的头文件中可以看到很多内容。但是,是的,很多这些东西都很容易在网上访问。例如,谷歌搜索 github gcc 弹出了这个: github.com/gcc-mirror/gcc

答:

5赞 eerorika 9/8/2023 #1

为什么 C++ 需要自己的 C 标准库 malloc/calloc/realloc/free 函数版本?

C++ 包含大部分 C 库的原因是交叉兼容性。特别是在 C++ 的早期,C 程序可以很容易地增量转换为 C++ 是很重要的。

C 语言中的一个大问题是名称冲突。C++ 引入了一种语言功能来缓解此问题:命名空间。C++ 标准库位于命名空间中。由于前面提到的交叉兼容性,当 C 继承的头文件包含在全局命名空间中时,C++ 标准库使用 C 标准库中的名称(如 )。std<stdlib.h>

他们的行为会有所不同吗?

不。它们是不同命名空间中的相同函数。

malloc/calloc/realloc/free

我应该更喜欢在 C++ 中使用 std:: 版本吗?

您应该不希望在 C++ 中使用任何提到的函数。你几乎从来不需要它们。使用它们的一个罕见原因是,当您用 C++ 增量重写 C 程序时,并且您不想在一次更改中替换所有旧代码。有时,如果您需要使用需要它的 C 库,则可能需要使用。std::free

除了您提到的函数之外,C 标准库的某些部分在 C++ 中没有新的替代品。在这种情况下,请使用 C++ 备用名称(如 )包含标头1,并引用命名空间中的名称。<cstdlib>std

1 或者在 C++23 中更好,根本不包含标头,而是。import std;

评论

0赞 simd 9/8/2023
谢谢!所以所有 C 标准库(我从你的回答中了解到很少有例外)都在 C++ 标准库中重新定义?我不知道。
1赞 BoP 9/8/2023
@simd - 它不必完全“重新定义”,就像进入命名空间一样。namespace std { using ::malloc; }malloc
0赞 Lundin 9/8/2023
“C语言中的一个大问题是名称冲突。当涉及到库函数时,这不是问题 - C 明确指出库函数的名称是为库保留的。因此,不是 C 标准库中不存在的问题的解决方案。相反,“所有 C”都最终出现在命名空间中,因为 C 库也是 C++ 标准库的一部分。它与命名空间冲突无关。std::std
1赞 Luis Colorado 9/8/2023 #2

为什么 C++ 需要自己的 C 标准库 malloc/calloc/realloc/free 函数版本?它们看起来都完全相同。我应该更喜欢在 C++ 中使用 std:: 版本吗?他们的行为会有所不同吗?

不。你错了。在 C++ 中使用的不同版本的 、 等函数。甚至头文件也是相同的(您需要使用它们,就像在 C 中一样)malloc()#include <stdlib.h>

这些函数确实属于 C 的世界,它们的使用不仅被弃用,也不推荐使用,因为 C++ 运行时有它的内存分配运算符 、 和 。这些是类型安全的,允许内存分配实现者构建分配和使用多个堆(例如,从不同的池中分配不同的类型) 然而,Stroustrups在他的书中不鼓励在C++中使用超级种子C函数。newnew[]deletedelete[]

但这并不意味着您看到的版本不同(例如 从 C++ 看作 ,在命名空间中)确实不同。它们似乎位于命名空间中,以允许您在自己的命名空间中编写自己的版本。C++ 被设计为能够从已经编写的 C 库中获利,这个子项目的成功为 C++ 语言增加了很多复杂性。没有白费。任何为 C 编写的函数都可以在 C++ 中自动使用。这解释了这样一个事实,即您实际使用的函数没有用 C++ 重写(也不鼓励使用它们)以便于使用(一旦您习惯了面向对象编程,上面引用的新调整将更加类型安全且易于使用)printfstd::printfstdstd