监控/调试内存使用情况的方法 C

3
我有一个问题,我的程序使用的内存比我认为应该使用的要多得多。
我使用了valgrind,这是一个非常好的工具,可以发现内存问题,如缓冲区溢出和内存泄漏等。
问题在于,看起来不像是泄漏,只是使用不一致,与我认为应该使用的不符。
是否有另一种工具可以像使用调试器(如gdb)监视变量值一样监视内存使用情况?
massif告诉我,大部分堆内存是通过以下语句分配的:
->98.80% (1,338,700,288B) 0x40341D5: caa (caa.c:196)

该语句是调用将元素推入UT_array的操作,例如:

utarray_push_back(utarr_ctr_pdws, &pdw);

pdw是指向结构体的指针,它是一个栈变量。

所以看起来UT_array正在malloc的内存没有被释放,但我在几行代码后有另一个声明显式地执行了这个操作:

utarray_free(utarr_ctr_pdws);

UT_array是指针数组,因此不需要在UT_ICD帮助结构中定义任何额外的dtor函数。

如果有人使用UT_arrays的经验,或许可以解释一下为什么会占用那么多内存?


2
你可以尝试使用Massif,这是Valgrind工具的一部分,用于显示堆分配情况。即使你没有严格意义上的内存泄漏(仍然保留指向已分配内存的指针),它也会向你展示在哪里分配了大量内存。 - BoBTFish
看起来不错 - 我现在正在试验它... - bph
根据我的经验,如果valgrind显示错误,那么就存在问题。你能否发布有问题的代码? - eyalm
这个平台是什么?Linux?你用什么来测量内存使用情况?'top'? - Multimedia Mike
问题已经被解决 - utarray 在if语句内部被释放,但它是在if语句外部创建的,因此会创建一堆数组但没有释放,听起来像是一个典型的内存泄漏,但是valgrind memcheck没有检测到 - 不确定为什么,可能是因为utarray是用宏实现的? - bph
显示剩余4条评论
2个回答

2

1
我怀疑你的 pdw 结构体中有一些你已经为其分配了空间。utarray_free 不会知道结构体的成员,因此它只会释放指向结构体本身的指针。如果你为结构体的任何成员分配了空间,除非在 UT_icd 中设置 dtor 函数以释放分配的结构体成员,否则 utarray_free 将不知道如何清除它们。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接