哪些文件包含 malloc() 和 new() 的实现?

Posted

技术标签:

【中文标题】哪些文件包含 malloc() 和 new() 的实现?【英文标题】:Which files contains the implementations for malloc() and new()? 【发布时间】:2013-06-23 14:31:19 【问题描述】:

在 Linux (Ubuntu) 上,我可以看到 malloc() 和 new() 实现中使用的 C/C++ 代码的路径和文件名是什么?

我查看了 /usr/include 但开始迷路了。它是否取决于我安装的 gcc/g++ 版本?

如果有人也能给出一个一般性的答案,这将帮助我了解 Linux 如何存储所有“本机”功能,那将不胜感激,我再也不必再要求不同的功能了。

【问题讨论】:

您可以在编译器使用的 C 标准库的实现中找到它。 查看 glibc 源码:gnu.org/software/libc 为什么要这些资源?你在网上搜索过吗?你知道 C 和 C++(没有 C/C++ 之类的东西)是编译成机器码的语言吗? @JensGustedt malloc() 在 C 中使用,而 new() 在 C++ 中使用,因此短语“C/C++”。我没有争论它们没有被编译成机器代码。我一直理解在 Linux 中你可以看到操作系统中的所有代码,因此我的问题是“new() 的代码在哪里?” 【参考方案1】:

一件事:new 是一个使用malloc 的 C++ 关键字。

malloc 的源代码在您的libc 版本的源代码中,可能是glibc。查看它们的来源。

system 调用的其他内置函数仅在 glibc 中具有调用底层系统调用的 shell 实现。

【讨论】:

@user997112:不,我只是指glibc 的代码,GNU libc 实现。 @Linuxios- 如何在我的 Ubuntu 文件系统中找到它?就像打开包含上述函数的 C/C++ 的文件一样?当我搜索 glibc 时,我只有一个充满 .so 文件的文件夹。 @user:他们不是本地的。您必须下载编译成这些 .so 文件的 c 源代码。 @Linuxios 顺便说一句,当你在静态编译时,你不会加载 .so 文件。在这种情况下,编译器如何以及做什么? @Maxime:我不太明白【参考方案2】:

The GIT of the GNU standard C lib implementation can be found here.

从树中的这一点您应该能够找到the rest as well。

【讨论】:

我认为我的 Ubuntu 文件系统上没有包含 malloc/new 实现的 .c 或 .cpp 文件是否正确?它们包含在一个.... .so 中?文件,这就是为什么我必须在线检查实现? 是的,用于构建 C 库的文件通常不包含在发行版中 - 有时源代码将包含在单独的包中,您可以单独安装,或者您可以在网站上找到它就像这个答案中建议的那样。【参考方案3】:

“实现”是您可以链接的库(“a”文件或“so”文件)以及包含声明的标头(“h”文件)。

C 和 CPP 文件位于创建这些库的计算机上,然后才用于构建您的系统。而且由于您的程序不需要它们的源代码(您只需链接二进制文件,而不是源代码),它们不会与系统构建一起分发。

这就是您必须从源存储库下载这些文件的原因,就像您希望自己重建系统一样。

【讨论】:

【参考方案4】:

您可以在编译器使用的 C 标准库的实现中找到它。

我不确定 Ubunta。 Debian 的 gcc 使用 eglibc,其来源为 could be found here。

【讨论】:

有没有办法在文件系统中找到实现? 您可能还想查看MUSL libc,其源代码可能更易于阅读。 MUSL libc 是另一种免费的 LibC 实现。 @user997112:默认情况下,libc 实现采用二进制格式,但对于开源版本,可以下载源代码。

以上是关于哪些文件包含 malloc() 和 new() 的实现?的主要内容,如果未能解决你的问题,请参考以下文章

C++ 98/03 应该学习哪些知识13

C++ malloc 与 new 的区别

C++ malloc 与 new 的区别

new和malloc的区别

C++中new出得对象与C中的malloc出得有啥联系和区别?

C++—new/delete/malloc/free详解