C运行时CRT与C ++运行时 - 堆内存管理模型

时间:2012-12-25 15:40:48

标签: c++ memory-management heap

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

其次,如果同时存在C和C ++运行时,C ++堆内存管理模型是否与CRT使用的C堆内存管理相同(namley使用内存块链接列表)?

编辑:

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

4 个答案:

答案 0 :(得分:2)

通常对于C ++程序,它们具有不同的运行时,但该运行时是在C运行时之上实现的,因此它们尽可能多地委托工作 - 并且内存管理是相当简单的。 C ++在C之上唯一要做的就是处理异常,析构函数以及其他内容 - 实际的内存分配本身可以来自malloc。但是,标准并不保证这一点,也不能依赖它。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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

我不确定担心是否有一堆,两堆,三堆或一千堆是有意义的 - 只要你能从你的代码相关的任何一个分配内存,它真的是一个实现细节有多少堆 - 我看到很少的情况下它们的数量很重要 - 除了每个堆的管理开销很小,也许。但是那将是大约几十个字节左右的顺序,除非有人真的过度使用堆设计。

如其他地方所述,C ++代码可能使用也可能不使用相同的堆或具有单独的堆。同样,它对您的代码没有任何影响。只要您释放它,就可以使用与分配时相同的方法 - 即,不使用new分配内容,free释放它,或mallocdelete。这将是非常糟糕的 - 即使数据来自同一个堆,您可能会发现new存储“隐藏”信息以跟踪数据,这与malloc具有的不同藏起来,这意味着malloc不“理解”发生了什么,发生了奇怪的崩溃!