提问人:simd 提问时间:9/8/2023 更新时间:9/8/2023 访问量:152
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
问:
为什么 C++ 需要自己的 C 标准库 malloc/calloc/realloc/free 函数版本?它们看起来都完全相同。我应该更喜欢在 C++ 中使用 std:: 版本吗?他们的行为会有所不同吗?
答:
为什么 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;
评论
namespace std { using ::malloc; }
malloc
std::
std
为什么 C++ 需要自己的 C 标准库 malloc/calloc/realloc/free 函数版本?它们看起来都完全相同。我应该更喜欢在 C++ 中使用 std:: 版本吗?他们的行为会有所不同吗?
不。你错了。在 C++ 中使用的不同版本的 、 等函数。甚至头文件也是相同的(您需要使用它们,就像在 C 中一样)malloc()
#include <stdlib.h>
这些函数确实属于 C 的世界,它们的使用不仅被弃用,也不推荐使用,因为 C++ 运行时有它的内存分配运算符 、 和 。这些是类型安全的,允许内存分配实现者构建分配和使用多个堆(例如,从不同的池中分配不同的类型) 然而,Stroustrups在他的书中不鼓励在C++中使用超级种子C函数。new
new[]
delete
delete[]
但这并不意味着您看到的版本不同(例如 从 C++ 看作 ,在命名空间中)确实不同。它们似乎位于命名空间中,以允许您在自己的命名空间中编写自己的版本。C++ 被设计为能够从已经编写的 C 库中获利,这个子项目的成功为 C++ 语言增加了很多复杂性。没有白费。任何为 C 编写的函数都可以在 C++ 中自动使用。这解释了这样一个事实,即您实际使用的函数没有用 C++ 重写(也不鼓励使用它们)以便于使用(一旦您习惯了面向对象编程,上面引用的新调整将更加类型安全且易于使用)printf
std::printf
std
std
评论
std
new
delete
std::malloc
std
std::pow
pow
std::malloc