jus*_*ase 3 c memory malloc memory-leaks memory-management
我想在调用函数之前和之后分配总内存,以确定我是否已正确释放所有内容.
我在C中这样做,我很生疏,所以请原谅我,如果这是一个天真的问题.我正在寻找类似于C#GC.GetTotalMemory(true)的东西,现在在Windows中.
现在我正在使用PROCESS_MEMORY_COUNTERS_EX
and 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++;
Run Code Online (Sandbox Code Playgroud)
得到这样的结果:
after.PrivateUsage - before.PrivateUsage = 12288
Run Code Online (Sandbox Code Playgroud)
如果我去评论一些免费电话,我会得到相同的结果.如何实际确定使用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__)
Run Code Online (Sandbox Code Playgroud)
在您自己的功能中,您可以在某些全局数据结构(例如链表)中收集诊断信息.例如:它可以维护,返回缓冲区地址,相应分配的大小等.
同样,你重载free()
并可以在那里进行簿记,传入函数的每个缓冲区地址都可以根据列表项进行检查并删除从列表中找到匹配项.
在程序结束时,列表包含已分配但从未释放的内存条目,即内存泄漏.您可以提供一些api,以便在需要时从列表中获取诊断详细信息.
您可以经常使用此技巧编写自己的内存泄漏检测器等,以进行调试.