我想之前和之后我调用一个函数,以确定如果我正确与否释放一切办法去分配的内存总量。
我用C这样做的,我很生疏所以请原谅我,如果这是一个幼稚的问题。 我在寻找类似C#GC.GetTotalMemory(真)的东西,这是在Windows现在。
现在,我使用PROCESS_MEMORY_COUNTERS_EX
和GetProcessMemoryInfo(...)
前后调用函数后,但因为如果我进入功能我不能让元首或输出的尾巴,注释掉调用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分配的内存的当前总规模?
我,不知道有任何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来从在需要时维护该列表的诊断信息。
您可以经常使用这种伎俩来写自己的内存泄漏检测仪等,进行调试。
我用我自己做了以前像这样年(堆栈溢出!这些伟大的日子之前) malloc
和free
之前和调用真正的记录后,一些指标功能malloc
和free
的功能。
你可以做这样的事情,是一种不依赖于平台的:
// 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
被调用。
如果你需要大量的运行指标,还有更好的,更全面的第三方库等等,让很多的更多信息; 然而,这是一个快速的小动作,当你需要在紧要关头来检查一番。
您可以使用Valgrind的检查,如果您已释放的进程退出所有动态分配的内存。