gpt4 book ai didi

c - C中的GetTotalMemory分配

转载 作者:太空狗 更新时间:2023-10-29 15:59:18 26 4
gpt4 key购买 nike

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

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

现在我正在使用 PROCESS_MEMORY_COUNTERS_EXGetProcessMemoryInfo(...),在调用该函数之前和之后,但我无法生成输出的正面或反面,因为如果我进入函数并注释掉对 free(...) 的调用,那么它会给我相同的结果(after 总是更大)。这是我现在拥有的...

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

如果我去注释掉一些对 free 的调用,我会得到相同的结果。我如何实际确定我使用 malloc 分配的当前内存总大小?

最佳答案

我不知道有任何 c 标准库函数可以帮助您实现这一点。 AFAIK,不存在任何。但是您可以使用某种 hack,不应在发布版本中使用它,而应仅用于调试和诊断目的。

您可以使用我所说的 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__)

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

您可以经常使用这个技巧来编写您自己的内存泄漏检测器等,用于调试目的。

关于c - C中的GetTotalMemory分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10472929/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com