鉴于Prototal内存分配使用C(GetTotalMemory allocation in C)

2019-09-17 01:37发布

我想之前和之后我调用一个函数,以确定如果我正确与否释放一切办法去分配的内存总量。

我用C这样做的,我很生疏所以请原谅我,如果这是一个幼稚的问题。 我在寻找类似C#GC.GetTotalMemory(真)的东西,这是在Windows现在。

现在,我使用PROCESS_MEMORY_COUNTERS_EXGetProcessMemoryInfo(...)前后调用函数后,但因为如果我进入功能我不能让元首或输出的尾巴,注释掉调用free(...)那么它会给我同样的结果(后总是大)。 以下是我现在所拥有的...

GetProcessMemoryInfo(hProc, &before, sizeof(before));
r = c->function();
GetProcessMemoryInfo(hProc, &after, sizeof(after));

if(r->result != 0) {
    printf("error: %s\r\n", c->name);
    printf("  %s\r\n", r->message);
    printf("  %s (%d)\r\n", r->file, r->line);
    failed++;
}
else if(after.PrivateUsage > before.PrivateUsage) {
    printf("memory leak: %s\r\n", c->name);
    printf("  %d kb\r\n", after.PrivateUsage - before.PrivateUsage);
    failed++;
}
else succeeded++;

有了这样的结果:

after.PrivateUsage - before.PrivateUsage = 12288

如果我去注释掉一些调用来释放我得到了相同的结果。 我怎样才能真正确定,我已经使用malloc分配的内存的当前总规模?

Answer 1:

我,不知道有任何C标准库函数,它可以帮助你实现这一目标。 据我所知,没有任何不存在的。 但是你可以使用某种的黑客,一个人不应该使用这个在发布版本,但用于调试和诊断仅目的。

你可以使用我调用malloc超载在C。 你这样做与宏的帮助。
你可以写在一个封装函数malloc ,而无需修改每个并在代码中的每个实例,其中函数被调用,然后简单的宏就足够了:

void* my_malloc(size_t size, const char *file, int line, const char *func)
{

    void *p = malloc(size);
    printf ("Allocated = %s, %i, %s, %p[%li]\n", file, line, func, p, size);

    /*Link List functionality goes in here*/

    return p;
}

#define malloc(X) my_malloc( X, __FILE__, __LINE__, __FUNCTION__)

里面你自己的功能,你可以收集诊断中一些全局数据结构,比如说一个链表。 对于例如:它可以维持,返回缓冲区地址,对于相应的分配等大小
同样,你重载free()你可以在那里做记账,在传递给函数每个缓冲区地址可以对列表中的项目进行检查,并从列表中移除,并在找到匹配。
在节目的最后名单包含已分配但永远不会被释放,又名内存泄漏内存条目。 你可以提供一些API来从在需要时维护该列表的诊断信息。

您可以经常使用这种伎俩来写自己的内存泄漏检测仪等,进行调试。



Answer 2:

我用我自己做了以前像这样年(堆栈溢出!这些伟大的日子之前) mallocfree之前和调用真正的记录后,一些指标功能mallocfree的功能。

你可以做这样的事情,是一种不依赖于平台的:

// in some common header file, let's say mem_metrics.h
#define malloc malloc_with_metrics
#define free   free_with_metrics

extern size_t num_current_allocs;
void* malloc_with_metrics(size_t size);
void free_with_metrics(void* ptr);


// in mem_metrics.c
#undef malloc
#undef free

size_t num_current_allocs = 0;

void* malloc_with_metrics(size_t size)
{
    ++num_current_allocs;
    return malloc(size);
}

void free_with_metrics(void* ptr)
{
    --num_current_allocs;
    free(ptr);
}

以上多少分配记录的示例存在于任何给定时间,通过访问num_current_allocs 。 您可以通过记录任何指标,您觉得有用的这个想法扩大! 我经常用它来确保num_current_allocs为0时,程序退出。

又如:我曾经用这样的事情通过保持指针表,并以字节为单位及其相应的大小,添加新的指针和它们的大小时,发现一些未释放字节malloc_with_metrics叫和删除它们时free_with_metrics被调用。

如果你需要大量的运行指标,还有更好的,更全面的第三方库等等,让很多的更多信息; 然而,这是一个快速的小动作,当你需要在紧要关头来检查一番。



Answer 3:

您可以使用Valgrind的检查,如果您已释放的进程退出所有动态分配的内存。



文章来源: GetTotalMemory allocation in C