varch/doc/valloc.md
2024-07-30 00:57:01 +08:00

2.5 KiB
Raw Permalink Blame History

介绍

内存动态分配是指在程序运行过程中根据程序的需要动态地分配内存空间以便存储数据或创建对象。内存动态分配通常使用指针来实现通过调用系统提供的内存分配函数如malloc、calloc等来申请内存空间申请成功后返回一个指向该内存空间的指针进而在程序中使用该指针来访问分配的内存空间。

内存动态分配的优点是可以动态地分配内存空间,避免浪费,提高内存使用效率。同时,动态分配的内存空间也可以随着程序的需求进行动态的释放,避免内存泄漏和出错。但是,使用内存动态分配也存在一些缺点,如容易出现内存泄漏、空间碎片等问题,需要程序员具有一定的技巧和注意事项才能正确、高效地使用内存动态分配。

这里,介绍一种可以检查动态内存使用情况的小工具valloc,以便统计动态内存的使用情况,以及检查是否有空间碎片忘记释放。用其方法代替的内存分配方法,可以计算动态内存使用的情况。

接口

检查未释放内存

void v_check_unfree(void);

获取已分配内存块计数

int v_check_count(void);

获取已使用内存总大小

int v_check_used(void);

使用

在使用上非常简单,如下几步。

1 在需要统计的源文件中添加 valloc.h 头文件,添加到 stdlib.h 后面,不管哪一行只要在其后面,valloc.h中的内存函数(malloc()等)会将stdlib.h中的覆盖掉,而使用valloc.h的函数。

2 在需要输出的地方,调用 valloc 的API即可。

例子

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "init.h"
#include "valloc.h"

static void test(void)
{
    void* p = NULL;
    printf("malloc %p\r\n", malloc(0));
    p = realloc(NULL, 100);
    p = malloc(64);
    p = malloc(50);
    printf("realloc %p\r\n", realloc(NULL, 0));
    printf("%d\r\n", *(int *)p);
    free(p);

    v_check_unfree();
    printf("count = %d\r\n", v_check_count());
    printf("used = %d\r\n", v_check_used());
}
init_export_app(test);

结果:

malloc 007B5B50
realloc 007B5C20
8086040
address: 007B5B50, size: 0, file: test/test_valloc.c, line: 10
address: 007B5B88, size: 100, file: test/test_valloc.c, line: 11
address: 007B5C20, size: 0, file: test/test_valloc.c, line: 14
address: 007B5C68, size: 64, file: test/test_valloc.c, line: 12
count = 4
used = 164