GNU C++如何实现new和delete操作。

4
我在libstdc++-v3中看到了一些声明,但找不到定义。是不是newdelete只是封装了mallocfree?我在哪里可以找到newdelete的定义?为什么我在bits/allocator.h中找不到bits/c++allocator.h的引用?在gcc中有这么多奇怪的事情。

我听说glibc中的mallocfree是使用ptmalloc实现的,想知道newdelete是否也使用了ptmalloc或其他策略? - Zakilo
4
https://gcc.gnu.org/viewcvs/gcc/trunk/libstdc%2B%2B-v3/libsupc%2B%2B/new_op.cc?view=markup - Marc Glisse
1
c++allocator.h 可以是 https://gcc.gnu.org/viewcvs/gcc/trunk/libstdc%2B%2B-v3/config/allocator/ 中的任何文件,这使得在配置 gcc 时选择不同的默认值更加容易。 - Marc Glisse
下载并阅读源代码(https://github.com/gcc-mirror/gcc/tree/master/libstdc%2B%2B-v3)。 - n. m.
3个回答

3
尽管C++规范指出开发人员应避免使用旧的malloc/free内存分配方式,但C++语言本身无法处理内存分配。new/delete像是对malloc/free的包装,具有C++类型安全特性,并在malloc返回NULL时抛出异常。这就是为什么“new”从不返回NULL而是抛出异常。它们会为您完成工作。
C++使用类似glibc、libc的C例程进行系统级操作。在Linux中,“实际”分配内存的唯一方法是调用brk()和mmap()。所有语言,包括Java和Python,都调用malloc()或更低级别的API来分配内存,并在回收“垃圾”时调用free()。
总之,你的问题的答案是“new/delete调用malloc/free并处理异常”。

2
你是指异常吗? - DaBler

2
新和删除仅封装了malloc和free吗?
请查看此StackOverflow答案。
在这里查找new和delete的定义说明。
我希望其他人可以帮助您回答第三个问题。

1
我刚刚添加了一个补充的注释。实际上,我想知道GNU C++在源代码中如何准确地实现newdelete。抱歉没有清楚地表达我的问题。 - Zakilo

0

它们是可以重新定义的处理程序。 "malloc" 和 "free" 是该结构的一部分。它们可以被重新定义以改善内存管理。

重载 new/delete


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接