因为在一个STM32F4平台的开发项目中使用了C++编程,使用到了new 、 delete ,malloc ,free 等堆空间操作的函数。
工程稍大,会偶尔提示分配失败的现象,初步怀疑内存泄露,所以会想到怎么查看当前使用到的堆空间情况。
heapstats堆信息获取
跳到stdlib.h头文件下看到这样一个函数。
typedef int (*__heapprt)(void *, char const *, ...);
extern _ARMABI void __heapstats(int (* /*dprint*/)(void * /*param*/,
char const * /*format*/, ...),
void * /*param*/) __attribute__((__nonnull__(1)));
看介绍应该是能获取堆的使用情况。看着函数稍有复杂。查看keil帮助,有这么些说明。
heapstats
dprint:该参数为格式化操作的接口函数,类型__heapprt,就是提供给这个函数重定向的接口。
想说一波细节呢,但感觉文字这个东西很费力,要描述很多字,程序员就该用程序交流。
直接写实现吧。看了实现八成也就看懂原理了。
实现函数
#include <stdarg.h>
static int my_heapprt(void *param, char const *format, ...)
{
if((*(int*)param)!=0) return 0;
va_list argp;
va_start( argp, format );
int data = va_arg( argp, int);
va_end( argp );
*(int*) param = data;
return -1;
}
//获取空闲堆大小
int heap_free_size()
{
int size = 0;
__heapstats((__heapprt)my_heapprt, &size);
return size;
}
测试代码
printf("heap > %d\r\n", heap_free_size());
void *p1 = malloc(1);
void *p2 = malloc(1);
printf("heap > %d p1>%X p2>%X\r\n", heap_free_size(), p1, p2);
p2 = malloc(1000);
printf("heap > %d p>%X\r\n", heap_free_size(), p2);
结果
结论
p1和p2地址间隔8个字节,malloc一块是8字节。
所以,可以正常获取剩余堆了。