带指针的内存管理

Posted

技术标签:

【中文标题】带指针的内存管理【英文标题】:Memory Management with pointers 【发布时间】:2019-12-11 21:10:03 【问题描述】:

我正在开发一个具有三个功能的 C 库。 Init 函数接受一个 (void*) 指向内存块的指针。我需要开发函数来从该块分配和释放内存块。这意味着我必须跟踪我已分配的内存块的哪些部分以及哪些部分是空闲的。问题是,我将实现的用于跟踪内存的结构也必须是所述内存块的一部分。我不允许为我的管理结构分配新内存。

我不知道该怎么做。

目前,我计划将前几百个字节指定为标题空间,并将其余字节划分为相同大小的帧。我将使用标题空间来创建一个数组,该数组将跟踪分配了哪些帧。为此,我需要一种将内存地址转换为 long int 的方法,这样我就可以将它们保存到数组中,而到目前为止我的搜索一无所获。

有没有办法做到这一点? 如果做不到这一点,在这种情况下还有其他方法可以实现管理结构。

【问题讨论】:

您应该对内存块中的所有内容使用整数偏移量,而不是尝试将指针转换为整数。 "需要一种将内存地址转换为 long int 的方法"。如果帧大小相等,则只需要帧号,否则只需要偏移量。事实上,对于相同大小的帧,您甚至可以使用空闲列表的位图节省大量空间。 另一种常见的替代方法是在每个托管块的前面放置一个固定大小的小标题,并用它来链接块。 话虽如此,这对于 SO 来说并不是一个合适的问题。我们不是设计讨论论坛,您需要就您编写的特定代码提出问题。因此,请接受上述建议并尝试编写代码。如果您无法使其正常工作,请发布您所写的内容,我们会帮助您解决问题。 @EricPostpischil 我的描述可能有点简洁,但关键是他需要展示一些更具体的东西,我们可以帮助纠正,而不是要求一个通用的设计。 【参考方案1】:

为此,我需要一种将内存地址转换为 long int 的方法,这样我就可以将它们保存到数组中,而到目前为止我的搜索一无所获。

有什么办法可以做到吗?

一般来说,您不需要将内存地址转换为整数类型来跟踪它们。选项包括:

使用给定内存块中的指针,使用char * 执行算术。 从内存中的指针中减去内存的基地址(同样是char *),得到ptrdiff_t 类型的偏移量(在<stddef.h> 中定义)并使用它们。 将地址转换为整数类型uintptr_t(在<stdint.h> 中定义)。与其他选项不同,这具有依赖于实现的行为。在常见的 C 实现中,转换的结果将是一个简单的内存地址,您可以按预期对其执行算术运算。但是,在某些 C 实现中,结果会更复杂,因此代码不会完全可移植。

【讨论】:

以上是关于带指针的内存管理的主要内容,如果未能解决你的问题,请参考以下文章

C的智能指针/安全内存管理?

智能指针--转

c++动态内存管理与智能指针

智能指针

boost的内存管理

动态内存管理