C中的GetTotalMemory分配

我想在调用函数之前和之后分配总内存,以确定我是否已正确释放所有内容。

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

现在我正在使用PROCESS_MEMORY_COUNTERS_EXGetProcessMemoryInfo(...) ,在调用函数之前和之后但是我无法对输出做出正面或反面,因为如果我进入函数并注释掉一个free(...)的调用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标准库函数可以帮助您实现这一目标。 AFAIK,没有任何存在。 但是你可以使用某种黑客攻击,不应该在发布版本中使用它,而只是用于调试和诊断目的。

您可以在c中使用我称之为malloc重载的内容 。 您可以在宏的帮助下完成此操作。
您可以在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__) 

在您自己的function中,您可以在某些全局数据结构(例如链表)中收集诊断信息。 例如:它可以维护,返回缓冲区地址,相应分配的大小等。
类似地,你重载free()并且可以在那里进行簿记。传入函数的每个缓冲区地址都可以根据列表项进行检查,并在找到匹配项时从列表中删除。
在程序结束时,列表包含已分配但从未释放的内存条目,即内存泄漏。 您可以提供一些api,以便在需要时从列表中获取诊断详细信息。

您可以经常使用此技巧编写自己的内存泄漏检测器等,以进行调试。

我做了类似于几年前的事情(在Stack Overflow的这些伟大日子之前!)通过使用我自己的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时添加新的指针及其大小, malloc_with_metrics在调用malloc_with_metrics时删除它们。

如果您需要大量的运行时指标,那么可以提供更好,更全面的第三方库等,以提供更多信息; 然而,当你需要在紧要关头检查一些东西时,这是一个快速的小技巧。

您可以使用Valgrind检查是否已在进程退出时释放所有动态分配的内存。