总glibc malloc()字节

时间:2014-07-28 13:32:38

标签: c++ memory memory-management malloc heap-memory

如何在程序中获取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实现,也可以使用我自己的mallocfree函数来实现,但是有更简单的方法可以获得malloc()总数吗?

3 个答案:

答案 0 :(得分:7)

各种语言标准说:

没有平台独立的方式来获取此信息。 malloc的不同实现可以提供此信息,但它将采用非标准方式。

Glibc提供:

  • 您可以使用__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
}