new 运算符在 C++ 内部如何工作?

逆向工程 C++ 记忆
2021-06-30 07:35:43

解释glibcmallocfreeglibc内部结构的文章数量众多。但是,我想知道动态内存管理在 C++ 中是如何工作的,特别是newanddelete运算符的本质我的兴趣在于维护的内部数据结构以及分配和取消分配算法。有哪些相同的好资源?

1个回答

这在某种程度上是特定于编译器的,但在大多数情况下newdelete基本上是围绕malloc和的薄包装器free(关于内存本身的分配)。C++ 标准中描述了一些关于新表达式和类及其成员的构造/销毁序列的其他 C++ 细节cppreference提供了一个很好的总结)。我所描述的一些有关的MSVC ++实现的细节在这里

一些额外的皱纹:

  • 一个类可以重新定义一个自定义运算符new/ delete,在构造该类的实例时,它将被调用而不是全局运算符这可能会导致多态类出现棘手的情况,因此编译器可能需要引入一个隐藏的虚拟析构函数(再次参见我的 OpenRCE 文章)。

  • 在分配类数组时,许多编译器还会在为该数组分配的内存中嵌入一些元素,以便可以正确销毁它。这就是为什么混合的原因之一delete,并delete[]可能是危险的。