- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
此 block 中提到的所有函数都是库函数。我该如何纠正这种内存泄漏?
它列在“仍可访问”类别下。 (还有4个,很像,只是大小不一)
630 bytes in 1 blocks are still reachable in loss record 5 of 5
at 0x4004F1B: calloc (vg_replace_malloc.c:418)
by 0x931CD2: _dl_new_object (dl-object.c:52)
by 0x92DD36: _dl_map_object_from_fd (dl-load.c:972)
by 0x92EFB6: _dl_map_object (dl-load.c:2251)
by 0x939F1B: dl_open_worker (dl-open.c:255)
by 0x935965: _dl_catch_error (dl-error.c:178)
by 0x9399C5: _dl_open (dl-open.c:584)
by 0xA64E31: do_dlopen (dl-libc.c:86)
by 0x935965: _dl_catch_error (dl-error.c:178)
by 0xA64FF4: __libc_dlopen_mode (dl-libc.c:47)
by 0xAE6086: pthread_cancel_init (unwind-forcedunwind.c:53)
by 0xAE61FC: _Unwind_ForcedUnwind (unwind-forcedunwind.c:126)
问题:一旦我运行我的程序,它就没有内存泄漏,但它在 Valgrind 输出中多了一行,这在以前是不存在的:
Discarding syms at 0x5296fa0-0x52af438 in /lib/libgcc_s-4.4.4-20100630.so.1 due to munmap()
如果无法纠正泄漏,有人可以至少解释为什么 munmap() 行导致 Valgrind 报告 0 个“仍然可访问”的泄漏吗?
编辑:
这是一个最小的测试样本:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
void *runner(void *param) {
/* some operations ... */
pthread_exit(NULL);
}
int n;
int main(void) {
int i;
pthread_t *threadIdArray;
n=10; /* for example */
threadIdArray = malloc((n+n-1)*sizeof(pthread_t));
for(i=0;i<(n+n-1);i++) {
if( pthread_create(&threadIdArray[i],NULL,runner,NULL) != 0 ) {
printf("Couldn't create thread %d\n",i);
exit(1);
}
}
for(i=0;i<(n+n-1);i++) {
pthread_join(threadIdArray[i],NULL);
}
free(threadIdArray);
return(0);
}
运行:
valgrind -v --leak-check=full --show-reachable=yes ./a.out
最佳答案
定义“内存泄漏”的方法不止一种。特别是,“内存泄漏”有两个在程序员中普遍使用的主要定义。
“内存泄漏”的第一个常用定义是,“内存已分配但在程序终止前未随后释放”。然而,许多程序员(正确地)争辩说符合此定义的某些类型的内存泄漏实际上不会造成任何问题,因此不应被视为真实“内存泄漏”。
“内存泄漏”的一个可以说更严格(也更有用)的定义是,“内存已分配并且不能随后被释放,因为程序不再有任何指向已分配内存块的指针。”换句话说,您不能释放不再有任何指针指向的内存。因此,这样的内存是“内存泄漏”。 Valgrind 使用术语“内存泄漏”的这个更严格的定义。这种泄漏类型可能会导致显着的堆耗尽,尤其是对于长期存在的进程。
Valgrind 泄漏报告中的“仍可访问”类别是指仅符合“内存泄漏”的第一个定义的分配。这些 block 没有被释放,但它们本可以被释放(如果程序员愿意的话),因为程序仍在跟踪指向这些内存块的指针。
一般情况下,无需担心“仍可到达”的 block 。它们不会造成 真正 内存泄漏可能导致的那种问题。例如,“仍可到达”的 block 通常不会耗尽堆。这是因为这些 block 通常是一次性分配,在整个进程的生命周期中都会保留对它们的引用。虽然您可以通过并确保您的程序释放所有 分配的内存,但这样做通常没有实际好处,因为操作系统无论如何都会在进程终止后回收所有进程的内存。将此与 true 内存泄漏进行对比,内存泄漏如果不加以修复,可能会导致进程在运行时间足够长的情况下耗尽内存,或者只会导致进程消耗比必要更多的内存。
可能只有在您的泄漏检测工具无法判断哪些 block “仍然可以访问”(但 Valgrind 可以做到这一点)或者您的操作系统无法判断所有分配是否具有匹配的“释放”时才有用回收终止进程的所有内存(已移植 Valgrind 以执行此操作的所有平台)。
关于c - Valgrind 检测到的 Still Reachable Leak,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3840582/
我的应用有时会抛出奇怪的日志,例如: :通知名称“com.apple.iapd.notify.extendedMode”已被注册 40 次 - 这可能是泄漏:通知名称“com.apple.iapd.n
我在 dotcloud 上使用 redis 内存存储,但尽管 key 已过期,但它的 used_memory 再也不会下降。从 redis-cli 使用 flushdb 或 flushall 不会导致
所以我一直在寻找这个问题的解决方案有一段时间了。我编写了一个程序来从两个单独的文本文件中获取数据,对其进行解析,然后输出到另一个文本文件和一个 ARFF 文件以供 Weka 分析。我遇到的问题是我编写
随着我继续学习 Rust,我正在从事一个涉及广泛使用谓词函数的项目。我决定用 Rust 闭包实现这些谓词,例如: type Predicate = Box bool> . 我的程序使用应用于这些谓词的
我的应用程序中有一个非常简单的 CUDA 组件。 Valgrind 报告了很多泄漏和仍然可以访问的问题,所有这些都与 cudaMalloc 调用有关。 这些泄漏是真的吗?我打电话cudaFree每 c
在 chrome latest 和其他浏览器中测试。此页面启动一个 timer() 每 60 秒刷新一次。在 init() 和每个 refresh() 上,它从服务器获取数据并在页面中显示相同的数据。
我正在尝试使用 pprof 来验证内存泄漏。 能否解释一下如何阅读您在以下位置找到的堆配置文件:http://localhost:6060/debug/pprof/heap?debug=1 此外,在启
我们遇到了由 GroovyShell/Groovy 脚本引起的内存泄漏(请参阅最后的 GroovyEvaluator 代码)。主要问题是(从 MAT 分析器复制粘贴): The class "java
我在 Ubuntu 中使用带有延迟长度字符变量的 gfortran 8.4,如下例所示: PROGRAM test IMPLICIT NONE CHARACTER(LEN=:),ALLOC
我正在阅读 Efficient Android Threading,上面写着 Instead of using nested classes with outer class references,
我们最近将我们的应用程序从 Java 7 迁移到 Java 8。从切换之日起,我们开始看到内存不足的元空间问题。我们尝试增加元空间空间大小,但没有帮助。 Jvisual VM(和 Jconsole)显
使用最新版本的 FFmpeg 读取图像文件时我遇到了内存泄漏,我无法追踪。 好像填完AVFrame与 avcodec_send_packet和 avcodec_receive_frame ,我调用av
我们有某种泄漏,我不明白其性质。 Gen0/1/2 堆的大小不会增加,但是工作集会增加,直到我们 OOM。 DebugDiag 告诉我 CLR.DLL 拥有不断增加的内存,并告诉我我们有一个不断增长的
一位系统管理员告诉 med,内存泄漏是不可见的。即,如果应用程序正在泄漏内存,则应用程序使用的所有内存可能在任务管理器或等效工具中不可见。 他似乎对此非常肯定。我一直认为在任务管理器(或进程资源管理器
我们正在自动化大多数可以自动化的已知问题(用于回归测试)。但是,我们确实通过第三方软件发现了内存泄漏。但是,我不知道如何自动执行我们发现并修复它们的内存泄漏测试。 有什么建议吗? 最佳答案 通常最好的
如果我有一个垃圾收集器来跟踪分配的每个对象并在它们不再具有对它们的可用引用时立即释放它们,您是否仍然存在内存泄漏? 考虑到内存泄漏是没有任何引用的分配不是不可能的还是我错过了什么? 编辑:所以我算作内
我有一个托管在 IIS 中的 WCF 应用程序(用 C#/.Net 4 编写)。随着时间的推移,进程的句柄计数或多或少以线性方式增加(在进程回收之前增加到 30,000)。根据 SysInternal
我从LeakSanitizer工具获得以下输出。正如工具所了解的那样,直接泄漏和间接泄漏有什么区别? 13: ==29107==ERROR: LeakSanitizer: detected memor
首先我是这样跑的: valgrind --leak-check=full --show-leak-kinds=all test_proc 和日志: ==30349== For counts of de
我知道每个进程都有操作系统分配的自己的地址空间。所以当程序终止时,整个地址空间都被标记为无效(或者可以再次自由重用)。现在,如果上述进程正在泄漏内存,那么在程序终止后会产生什么影响吗? 也就是说,如果
我是一名优秀的程序员,十分优秀!