如何在程序中获取malloc()的总字节数(假设我正在运行glibc)? 我不想看到程序占用了多少内存,我想知道我分配了多少内存。下面是一个示例程序,其中这些数字将非常不同。
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
int main() {
vector<void *> p;
printf("Allocating...\n");
for (size_t i = 0; i < 1024 * 1024 * 10; ++i) {
p.push_back(malloc(1024));
memset(*p.rbegin(), 0, 1024);
}
printf("Press return to continue...\n");
getchar();
printf("Freeing all but last...\n");
for (size_t i = 0; i < p.size() - 1; ++i)
free(p[i]);
printf("Press return to continue...\n");
getchar();
// UNTIL THIS FREE, TOP WOULD SHOW THIS PROGRAM TAKES 16G,
// BUT THE TOTAL MALLOC() SIZE IS MUCH LESS.
printf("Freeing last...\n");
free(*p.rbegin());
printf("Press return to continue...\n");
getchar();
}
我知道这可以通过LD_PRELOAD实现,也可以使用我自己的malloc
和free
函数来实现,但是有更简单的方法可以获得malloc()
总数吗?
答案 0 :(得分:7)
没有平台独立的方式来获取此信息。 malloc的不同实现可以提供此信息,但它将采用非标准方式。
您可以使用__malloc_hook
功能编写一个计算已分配内存量的挂钩。
还有mallinfo()
,它应提供有关已分配内存的一些信息。
答案 1 :(得分:2)
创建一个全局变量和您自己的malloc()
函数
static size_t count;
void *malloc_ex(size_t n)
{
count+=n;
return malloc(n);
}
然后,您现在可以通过查看count
变量来分配多少字节。
编译器将全局变量初始化为0,这样就可以了。
请不要#undef
malloc
并重新#define
malloc_ex()
这将是未定义的行为。
答案 2 :(得分:1)
您应该定义两个函数,并分配额外的空间来跟踪每次调用自定义分配器函数所分配的内存。
//Space to store the size of an allocation
struct _room {
size_t sz; //Chunk size
char padding[16-(sizeof(size_t) % 16)]; //Force 16-byte alignment
}
//A global variable to keep track of the total amount of memory allocated (except the extra space of storing chunk sizes
static size_t TOTAL = 0;
//Custom allocator
void *mymalloc(size_t sz) {
//Allocate memory plus room for storing the chunk size. We'll need it later in
//myfree() to appropriately decrement TOTAL.
struct _room *r = (struct _room *) malloc(sz + sizeof(struct _room));
r->sz = sz;
TOTAL += sz; //keep track of user allocated memory
return (void *) (r+1); //Pointer to usable memory
}
void myfree(void *m) {
//Point to the register with chunk size, given the memory pointer returned my mymalloc()
struct _room *r = ((struct _room *) m) - 1;
TOTAL -= r->sz; //Update total
free((void*)r); //Free all memory: room + user memory
}