【问题标题】:C Run-Time CRT vs C++ Run-Time - heap memory management model [closed]C 运行时 CRT 与 C++ 运行时 - 堆内存管理模型 [关闭]
【发布时间】:2012-12-11 12:05:47
【问题描述】:

是否有 C 运行时库和 C++ 运行时库或者只有 C 运行时(即:因此 C++ 程序使用 C 运行时,也许还有一个 c++ 运行时库和 C++ 使用 C 和C++ 运行时库)

其次,如果同时存在 C 和 C++ 运行时,C++ 堆内存管理模型是否与 CRT 使用的 C 堆内存管理相同(namley use of linked list for memory block)?

编辑:

第三,如果一个C++程序使用CRT,是否意味着程序有两个堆?一个由 CRT 使用,一个由 C++ Run-Time 使用?

【问题讨论】:

  • 帮提一下工具链或操作系统。
  • @brian:实际上我不是在谈论特定的平台,我的意思是一般来说是什么做法。
  • 但是不同平台的答案是不同的,标准让这对实现变化开放。

标签: c++ memory-management heap-memory


【解决方案1】:

通常对于 C++ 程序,它们有一个独特的运行时,但该运行时是在 C 运行时之上实现的,因此它们会尽可能多地委派工作,而内存管理是一个相当简单的工作。 C++ 在 C 之上唯一要做的就是处理异常、析构函数等等——实际的内存分配本身可以直接来自malloc。但是,该标准根本不保证这一点,也不能依赖它。

【讨论】:

  • 所以在实践中,new 调用由malloc 调用结束?
  • 是的,new 经常被实现为malloc(当然delete 最终会使用free 来解除分配),或者某些常见的较低级别的分配函数案例。但不要依赖于此,C++ new 可能会做一些完全不同的事情“因为这是一个做不同事情的好机会”
  • 对 new 获得的东西调用 free() 或对 malloc 获得的东西调用 delete 是非常糟糕的想法。
  • @Brian: Mats 不是这么说的
  • @guillaume07:实际上,由于 new 不仅仅是分配,而且 free 不仅仅是释放,即使他们在幕后使用 malloc 和 free,它仍然不安全混合 malloc 和 free!
【解决方案2】:

Windows 上的堆有点奇怪。如果 DLL 在 C 运行时静态链接,则该 DLL 将获得自己的堆。因此,如果您有 5 个这样的 DLL,那么您的进程至少有 5 个堆。你需要非常小心地在调用 malloc() 的同一个 DLL 中调用 free() (或 delete / new)。

【讨论】:

    【解决方案3】:

    假设您谈论的是同一个编译器套件(例如 GCC 或 Visual C++),通常有 C 和 C++ 运行时,如果/当您使用 C 运行时,C 运行时也用于 C++ 程序C 函数。

    通常,C++ 运行时的内存管理使用 C 运行时的内存管理,但这绝不是给定的,也不应该依赖。毕竟,如果您可以向现有实现添加另一个接口,那么重新实现完整的堆管理器通常没有太大意义。

    【讨论】:

      【解决方案4】:

      C 和 C++ 没有定义“堆”除了公共接口之外的工作方式,例如 mallocnewfreedelete 以及这些接口的一些兄弟姐妹。每个编译器/库供应商都会自己制作(是的,您可以使用不属于编译器套件的库,例如 gcc MingW 在很大程度上使用 Microsoft 库)。

      我不确定担心是否有一个堆、两个堆、三个堆或一千个堆 - 只要您可以从与您的代码相关的任何一个分配内存,这真的是一个实现详细说明了有多少堆 - 我看到很少有堆的数量很重要的情况 - 除了每个堆可能具有的一点点管理开销之外。但这将是几十个字节左右,除非有人真的过度使用堆设计。

      正如其他地方所提到的,C++ 代码可能使用也可能不使用相同的堆或具有单独的堆。同样,它对您的代码没有任何影响。只要释放它时,使用与分配时相同的方法——即不要使用new 分配某些东西,而不要使用free 来释放它,或者mallocdelete。那将是非常糟糕的 - 即使数据来自同一个堆,您也可能会发现 new 存储了用于跟踪数据的“隐藏”信息,这与 malloc 隐藏的信息不同,后者意味着malloc 不“理解”正在发生的事情,会发生奇怪的崩溃!

      【讨论】:

      • 多个堆可以产生影响。从一个分配的内存必须释放到同一个堆..
      • 是的,这就是为什么我说“您需要在分配时使用匹配方法释放内存”。希望没有人为使用“私有”(或“单独”)堆的函数设计接口,要求您在其上调用 free() ......这将是相当愚蠢的!
      • 不,我的意思是,如果您有一个使用new 分配内存的静态库,那么您不能在您的代码中安全地使用delete。它技术上不是匹配方法,尽管所有的外观都不是这样。这更像是一个 C 接口问题,C++ 通常使用智能指针来绕过这个问题。
      • 是的,我的观点是,如果静态库有一个调用 new 的“create stuff”,它也应该有一个相应的“destroy stuff”函数来释放它。否则,首先提出这个想法的人应该受到惩罚。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-17
      • 1970-01-01
      • 2021-11-18
      • 1970-01-01
      相关资源
      最近更新 更多