gpt4 book ai didi

c - 涉及 C free() 的单元测试

转载 作者:行者123 更新时间:2023-12-05 01:27:16 27 4
gpt4 key购买 nike

我在使用 C 的 Unix/Linux 中工作。我对内存分配的工作原理有基本的了解,足以知道如果我 malloc() 然后 free(),我不太可能真正释放整个页;因此,如果我在 free() 之前和之后使用 getrusage(),我不太可能会看到任何差异。

我想为破坏数据结构的函数编写单元测试,以查看所涉及的内存区域实际上已被释放。我对依赖于操作系统的解决方案持开放态度,在这种情况下,我的主要平台是

Linux beast 3.2.0-23-generic #36-Ubuntu SMP Tue Apr 10 20:39:51 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux

使用 OS X 和 FreeBSD作为二次元。如果有使检查 free() 相对容易的解决方案,我也愿意减少替换 malloc()。

需要说明的是,我正在测试一个删除大型数据结构的例程,我想确保所有分配的区域实际上都被释放了,本质上是一个单元测试,特定单元没有基本内存泄漏。我将假设 free() 完成了它的工作,我只是确保我的代码实际上在它负责的所有分配区域上调用 free。

在这种特殊情况下,它是一个树结构,对于树中的每条数据,该结构负责调用删除存储在树中的数据的例程,这可能是其他一些任意的事情......

最佳答案

我不想再这样做了,但经过一夜的 sleep 后,我找到了一个明确的答案,它来自 SVID(有人还记得 System V 吗?),但被并入了 Linux 上的 glibc,可能是通过它在 dlmalloc 中的使用;因此它可以通过使用 dlmalloc() 作为替换 malloc 的替代品在其他系统上使用。

使用例程

struct mallinfo mallinfo(void);

struct mallinfo 是

struct mallinfo
{
int arena; /* non-mmapped space allocated from system */
int ordblks; /* number of free chunks */
int smblks; /* number of fastbin blocks */
int hblks; /* number of mmapped regions */
int hblkhd; /* space in mmapped regions */
int usmblks; /* maximum total allocated space */
int fsmblks; /* space available in freed fastbin blocks */
int uordblks; /* total allocated space */
int fordblks; /* total free space */
int keepcost; /* top-most, releasable (via malloc_trim) space */
};

特别是 arena 和 uordblks 将为您提供 malloc() 分配的字节数,与使用 sbrk() 或 mmap() 从操作系统请求的页面大小无关,这些页面由 arena 和 hblkhd 给出。

关于c - 涉及 C free() 的单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11423665/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com