- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我很难确定我的代码中哪里有内存泄漏。
我运行的 valgrind 命令:
valgrind --leak-check=full --log-file=vg1.log --show-leak-kinds=all --leak-resolution=low --track-origins=yes --leak-check-heuristics=all ./enalu_dbg
和输出
==22866== Memcheck, a memory error detector
==22866== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==22866== Using Valgrind-3.10.1 and LibVEX; rerun with -h for copyright info
==22866== Command: ./enalu_dbg
==22866== Parent PID: 21933
==22866==
==22866==
==22866== HEAP SUMMARY:
==22866== in use at exit: 47,252 bytes in 240 blocks
==22866== total heap usage: 288 allocs, 48 frees, 55,138 bytes allocated
==22866==
==22866== 4 bytes in 1 blocks are still reachable in loss record 1 of 23
==22866== at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==22866== by 0x77018CD: ??? (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4002.0)
==22866== by 0x7701D28: g_private_get (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4002.0)
==22866== by 0x76DB20C: g_slice_alloc (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4002.0)
==22866== by 0x76AF17D: g_hash_table_new_full (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4002.0)
==22866== by 0x76CF494: g_quark_from_static_string (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4002.0)
==22866== by 0x74314AB: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4002.0)
==22866== by 0x4010139: call_init.part.0 (dl-init.c:78)
==22866== by 0x4010222: call_init (dl-init.c:36)
==22866== by 0x4010222: _dl_init (dl-init.c:126)
==22866== by 0x4001309: ??? (in /lib/x86_64-linux-gnu/ld-2.19.so)
...
==22866== 184 bytes in 1 blocks are possibly lost in loss record 13 of 23
==22866== at 0x4C2CE8E: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==22866== by 0x76C56AE: g_realloc (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4002.0)
==22866== by 0x7451618: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4002.0)
==22866== by 0x74560D4: g_type_register_static (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4002.0)
==22866== by 0x7442DE6: g_param_type_register_static (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4002.0)
==22866== by 0x74449AB: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4002.0)
==22866== by 0x74315E9: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4002.0)
==22866== by 0x4010139: call_init.part.0 (dl-init.c:78)
==22866== by 0x4010222: call_init (dl-init.c:36)
==22866== by 0x4010222: _dl_init (dl-init.c:126)
==22866== by 0x4001309: ??? (in /lib/x86_64-linux-gnu/ld-2.19.so)
==22866==
...
==22866== 6,028 bytes in 60 blocks are still reachable in loss record 21 of 23
==22866== at 0x4C2CC70: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==22866== by 0x76C5668: g_malloc0 (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4002.0)
==22866== by 0x74514D9: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4002.0)
==22866== by 0x74560D4: g_type_register_static (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4002.0)
==22866== by 0x7442DE6: g_param_type_register_static (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4002.0)
==22866== by 0x744423A: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4002.0)
==22866== by 0x74315E9: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4002.0)
==22866== by 0x4010139: call_init.part.0 (dl-init.c:78)
==22866== by 0x4010222: call_init (dl-init.c:36)
==22866== by 0x4010222: _dl_init (dl-init.c:126)
==22866== by 0x4001309: ??? (in /lib/x86_64-linux-gnu/ld-2.19.so)
==22866==
==22866== 10,360 bytes in 5 blocks are still reachable in loss record 22 of 23
==22866== at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==22866== by 0x8B16E9A: ??? (in /usr/lib/x86_64-linux-gnu/libpixman-1.so.0.30.2)
==22866== by 0x8B15ACE: ??? (in /usr/lib/x86_64-linux-gnu/libpixman-1.so.0.30.2)
==22866== by 0x8B17585: ??? (in /usr/lib/x86_64-linux-gnu/libpixman-1.so.0.30.2)
==22866== by 0x8AC9508: ??? (in /usr/lib/x86_64-linux-gnu/libpixman-1.so.0.30.2)
==22866== by 0x4010139: call_init.part.0 (dl-init.c:78)
==22866== by 0x4010222: call_init (dl-init.c:36)
==22866== by 0x4010222: _dl_init (dl-init.c:126)
==22866== by 0x4001309: ??? (in /lib/x86_64-linux-gnu/ld-2.19.so)
==22866==
==22866== 16,600 bytes in 4 blocks are still reachable in loss record 23 of 23
==22866== at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==22866== by 0x76C5610: g_malloc (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4002.0)
==22866== by 0x76CF445: g_quark_from_static_string (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4002.0)
==22866== by 0x74314AB: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4002.0)
==22866== by 0x4010139: call_init.part.0 (dl-init.c:78)
==22866== by 0x4010222: call_init (dl-init.c:36)
==22866== by 0x4010222: _dl_init (dl-init.c:126)
==22866== by 0x4001309: ??? (in /lib/x86_64-linux-gnu/ld-2.19.so)
==22866==
==22866== LEAK SUMMARY:
==22866== definitely lost: 0 bytes in 0 blocks
==22866== indirectly lost: 0 bytes in 0 blocks
==22866== possibly lost: 1,352 bytes in 18 blocks
==22866== still reachable: 45,900 bytes in 222 blocks
==22866== of which reachable via heuristic:
==22866== newarray : 1,536 bytes in 16 blocks
==22866== suppressed: 0 bytes in 0 blocks
==22866==
==22866== For counts of detected and suppressed errors, rerun with: -v
==22866== ERROR SUMMARY: 3 errors from 3 contexts (suppressed: 0 from 0)
显示的大多数记录(但 1 个)是“仍可到达的 block ”。我读到这些可能是由于池释放延迟所致。即在我的 main(argc,argv){} 函数终止后释放容器(例如我经常使用的 vectors )。
但是,肯定有问题,因为在执行大约 8-9 小时后,我清楚地看到可执行文件使用的内存比开始时多(在我的电脑中,它开始时内存使用量为 0.6%,8 小时后它使用了大约 6%)。
问题是这些是神秘的消息 - 绝对没有来 self 的源文件。正如我所读,here“_dl*”调用与 linux 加载程序有关。那么我该如何查明问题的根源呢?
我应该补充一点,这段代码使用
然而,我已经从概念验证部分的小部分构建了代码,这些部分在 valgrind 中没有显示任何错误/警告。
此外,我的代码中只有有限数量的指向类对象的指针,我已验证我在各自的析构函数中删除
。
最佳答案
原始分配调用来自共享库初始化代码,当您的应用程序链接的共享库在运行时加载时执行,通常在您的任何应用程序代码实际运行之前。这就是为什么您在回溯中看不到您的代码的原因。它甚至还没有运行。
要查找的关键符号是_dl_init
,它是共享库初始化的入口点。查看它的上游会告诉您正在初始化哪个库。在您的例子中,它是一堆 Gnome 库和一个名为“libpixman”的库。
共享库也有一个清理函数,当共享库被卸载时会被调用。
组织良好的共享库将使用共享库清理功能有序地释放它在启动时分配的所有内存。不幸的是,这种对细节的粗心很常见:共享库从堆中分配一堆内存,用于共享库的内部静态表,而没有在卸载共享库时费心去释放该内存。
这不太可能是您在应用程序运行时观察到的内存泄漏的原因,除了我稍后会提到的一种情况。根据我的经验,这种草率的分配做法仅用于共享库在加载时分配一次的静态表。这里的想法是没有必要在自己之后明确清理,因为当进程退出时,库只会被卸载一次。
遗憾的是,偷工减料的开发人员从未听说过dlopen
() 和dlclose
()。这使得大型应用程序无法仅在需要时按需加载共享库,然后再卸载它,直到再次需要它为止。
因此,除非您的应用程序代码重复 dlopen
()ing 和 dlclose
()ing 所有这些 Gnome 库和 libpixman,否则您将不得不继续寻找你在其他地方泄漏。您应该继续阅读并使用 valgrind 的抑制文件,以抑制其输出中的这种烦人的噪音。
关于c++ - "still reachable"和 "possibly lost" block 的 C++ 中的 valgrind 输出不引用我的来源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34643910/
我只是设法与 svn 陷入了一个奇怪的境地。就工作副本而言,我的一个文件似乎“丢失”了。当我查看服务器或在另一个位置重新 check out 包含文件夹时,文件在那里,但在这个特定的工作副本中,它似乎
我使用的是 Delphi 2007。有时链接到组件的属性会丢失。这通常是操作属性和查找数据集。我有几次进行了一些紧急错误修复并向客户发送了一个版本,因此产生了一些灾难性的结果:-)任何人都知道一种方法
我已经安装了 RabbitMQ Bundle。现在这是我想要做的: Controller :创建Redis-List,将消息推送到客户端,然后将消息发送到队列中,因此可以异步执行较重的后台任务。 但我
我在文件中有一个矩阵,例如: 3 1 2 3 4 5 6 7 8 -9 其中第一行表示方阵阶数。我正在使用以下代码读取文件并将其存储到 vector 中(为了简单起见,我删除了所有 if 检查): #
说 Pokemon 是一个类。考虑这个片段: Pokemon Eve(4,3); //call to constructor, creating first object on the stack E
这真的很奇怪。我正在使用 SQL Server Express 2005,并具有以下连接字符串(在 DotNetNuke web.config 中): Data Source=ELECTROMORPH
我有一个包含两个项目的 C# 解决方案:一个服务(主项目)和一个记录器。该服务使用来自记录器的类。我在服务项目中添加了对记录器项目的引用。在设计时,自动完成工作正常:记录器的类是可见的,我使用的引用有
我最近将valgrind与glib(与gobject)一起使用,效果不是很好。 我在命令行中添加了G_SLICE=always-malloc G_DEBUG=gc-friendly, 但是valgri
从 Delphi 2010 升级后,我丢失了 Delphi XE 中的大部分库路径, 现在,即使是一些简单的应用程序也将无法编译。 有什么方法可以恢复库路径中丢失的目录条目吗? 编辑:我发现了一个令人
我最终使用 Eng. 的方法在 JFileChooser 的 JList 和 JComboBoxes 中自定义了选择颜色。福阿德建议here public void customizeJFileCho
我尝试使用返回字符串的 StreamReader 类的 ReadToEnd() 方法读取 JPG 文件。 但出于某种原因,当我将此字符串写入文件时,它无法打开。 将数据读入字符串时是否丢失了什么? 最
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
基本上,我的问题是:是否有某种方法可以“恢复”因向上转换为非泛型基类型而丢失的类型参数,例如 Object .这是我的意思的一个例子: 假设我收到了一个 Object l来自图书馆,我知道 l是一个
我无法让 UIView 通过多次触摸来响应我想要的方式。基本上某些 UITouches 在 UITouchPhaseBegan 中,但永远不会进入 UITouchPhaseEnded 或 UITouc
我面临一个设计问题,我希望只有一个 JMS 生产者向两个消费者发送消息。只有两台服务器,生产者将开始生成消息,这些消息将对两个消费者进行负载平衡(通过循环)。 在假设一台服务器发生故障的情况下,我确实
我正在尝试创建一些程序以便正确地为测试做好准备,这很快就会完成。但实际上,经过几天对这些代码的研究,我无法找到 valgrind 报告的内存泄漏的实际位置。 我尝试释放几乎所有内部和外部指针。我尝
我想使用 Requests 包连接到 Web 服务的流 API。假设我使用以下代码发送请求、接收响应并在响应行到达时对其进行迭代: import requests r = requests.get('
我有一个类,它被另一个类的方法动态扩展。这些方法中还有一些额外的静态信息,例如。例如: class A # @b = B.new # in initialize def a puts
我想对一个变量进行位移并将移出的位存储在 bool 值中。 类似于: unsigned int i = 1; bool b = rshift(&i); // i now equals 0 and b
我有一个超过 18GB 数据的 9000 万条记录的 MYISAM 表,测试表明它是分区的候选者。 原始架构: CREATE TABLE `email_tracker` ( `id` int(11
我是一名优秀的程序员,十分优秀!