0

是否有 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++ 运行时使用?

4

4 回答 4

2

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

于 2012-12-25T15:51:13.457 回答
2

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

于 2012-12-25T15:51:20.617 回答
1

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

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

于 2012-12-25T15:46:27.960 回答
0

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

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

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

于 2012-12-25T16:09:34.120 回答