- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我的一些应用程序以及这些应用程序使用的 dll 中有许多引用计数类,它们都继承并实现了 IRefCounted 接口(interface)。
为了帮助找到这些内存泄漏的根源,我希望每个应用程序都维护一个列表,其中包含所有这些存在的引用计数类。
问题是管理这些列表的实例,这样它们的使用不会影响我的类的使用(例如,我不需要一直传递一个指向列表的指针,而是以某种方式将它附加到过程)。
-这些应用程序中的几个很有可能同时运行,并使用相同的 dll。每个应用程序都需要自己的对象列表,并且该应用程序加载的所有 dll 等都需要使用该列表(但请记住,一个 dll 可能会被多个应用程序加载...)。
-列表必须在应用程序中的每个其他全局变量和静态变量之后被销毁,因此当它被销毁时留在列表中的对象是真正没有正确释放的对象。
然后我将简单地向列表的析构函数添加一个断点,这样我就可以在调试器中查看任何未分配的对象。
最佳答案
如果进程使用同一个 DLL,则每个进程都会获得该 DLL 的静态(或“全局”)数据的私有(private)拷贝。
所以您需要做的就是使列表成为 DLL 中的全局变量,并从每个应用程序链接到该 DLL。这样,就不需要传递任何额外的东西。
由于多 DLL 进程中对象销毁顺序的不可预测性,您捕获列表销毁的想法充满了困难。
在 main
或 WinMain
函数的末尾转储列表的内容会简单得多。
如果您没有以一致的方式使用智能指针类,那么就这样做吧。此外,可能值得寻找循环引用计数 - 对象 A 对对象 B 有一个计数,反之亦然。这是未释放对象的常见原因。
更新:
要强制所有静态析构函数运行并释放对象,以便您随后可以检查列表中的条目,您需要以某种方式构建您的应用程序。
假设您有一个非常小的 EXE 来启动进程,并加载许多实际完成所有工作的其他 DLL。这些其他 DLL 以某种方式(可能通过 COM 或类似 COM 的系统)使用 LoadLibrary 加载。 LoadLibrary API 的工作方式是将 DLL 加载到进程中,或者在 DLL 已加载的情况下递增 DLL 上的内部引用计数器。 FreeLibrary API 递减计数器直到它达到零,然后卸载 DLL(此时将执行该 DLL 的静态析构函数)。
为此,我们现在添加我们的诊断 DLL,其中包含所有未完成的引用计数对象的列表。所有其他 DLL 都使用 import-lib 链接到诊断 DLL,EXE 也在其上使用 LoadLibrary。
当 main
即将退出时,EXE 遍历它之前加载的 DLL 句柄列表,并对所有这些句柄调用 FreeLibrary。通过保持诊断 DLL 的加载,它确保它在最后仍然存在。至少理论上是这样。
但是应该以什么顺序卸载其他 DLL?如果 A.DLL 具有指向 B.DLL 中定义的对象的静态指针,那么您最好先卸载 A。因此,您需要了解各种 DLL 如何形成“分层”架构,较高层依赖于较低层,从而为您提供卸载它们的安全顺序。
此外,一旦您卸载了所有 DLL,诊断列表中引用 DLL 中对象的任何条目现在将指向堆上的有效数据,但 vtable 将指向由定义的代码现在已经卸载的 DLL,因此您将无法在这些对象上调用虚函数。不过,您应该能够检查他们的数据。
关于C++:调试引用计数系统中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/740100/
IntentReceiver 正在泄漏 由于 onDetachedFromWindow 在某些情况下未被调用。 @Override protected void onDetachedFromWind
好吧,我很难追踪这个内存泄漏。运行此脚本时,我没有看到任何内存泄漏,但我的 objectalloc 正在攀升。 Instruments 指向 CGBitmapContextCreateImage >
我编写了一个测试代码来检查如何使用 Instrument(Leaks)。我创建了一个单一 View 应用程序,单击按钮后我加载了一个像这样的新 View ... - (IBAction)btn_clk
我正在使用这个简单的代码并观察单调增加的内存使用量。我正在使用这个小模块将内容转储到磁盘。我观察到它发生在 unicode 字符串上而不是整数上,我做错了什么吗? 当我这样做时: >>> from u
我有以下泄漏的代码。 Instruments 表示,泄漏的是 rssParser 对象。我“刷新”了 XML 提要,它运行了该 block 并且发生了泄漏...... 文件.h @interface
我在我编写的以下代码片段中发现了内存泄漏 NSFileManager *fileManager=[[NSFileManager alloc] init]; fileList=[[fileManager
因此,我正在开发HTML5 / javascript rts游戏。观察一直有几种声音在播放。因此,对我来说,是一段时间后声音听起来像是“崩溃”,并且此浏览器选项卡上的所有声音都停止了工作。我只能通过重
下面是我正在使用的一段代码及其输出。 my $handle; my $enterCount = Devel::Leak::NoteSV($handle); print "$date entry $en
在这篇关于 go-routines 泄漏的帖子之后,https://www.ardanlabs.com/blog/2018/11/goroutine-leaks-the-forgotten-sende
我想知道为什么在执行 ./a.out 后随机得到以下结果。有什么想法我做错了吗?谢谢 http://img710.imageshack.us/img710/8708/trasht.png 最佳答案 正
我正在 Swift 中开发一个应用程序,在呈现捕获我放在一起的二维码的自定义 ViewController 后,我注意到出现了巨大的内存跳跃。 该代码本质上基于以下示例:http://www.appc
下面是我的 javascript 代码片段。它没有按预期运行,请帮我解决这个问题。 function getCurrentLocation() { console.log("insi
我们在生产环境中部署了 3 个代理 Kafka 0.10.1.0。有些应用程序嵌入了 Kafka Producer,它们将应用程序日志发送到某个主题。该主题有 10 个分区,复制因子为 3。 我们观察
我正在使用仪器来检测一些泄漏,但有一些泄漏我无法解决; NSMutableString *textedetails = [[NSMutableString alloc] init];
如果我使用性能工具测试我的代码 - 泄漏,它没有检测到任何泄漏。这是否意味着代码没有泄漏任何内存? 我有一个越狱的 iPhone,我可以监控可用内存。如果有人知道,那就是 SBSettings。我测试
我在从 AddressBook 中获取图像时遇到了很大的问题,下面我粘贴了我的代码。此 imageData 从未被释放,在我的 Allocations Instruments 上它看起来总是在内存中它
- (NSMutableArray *)getArrayValue:(NSArray *)array{ NSMutableArray *valueArray = [NSMutableArra
Instruments 工具说这是一个泄漏,有什么想法吗? 我在 for 循环结束时释放变量对象 在上述方法的开头,这就是我设置变量对象的方式,即自动释放; NSMutableArray *varia
我正在跟踪我的 iOS 应用程序的内存泄漏,我有一个奇怪的泄漏导致我的应用程序崩溃......负责的框架是:CGImageMergeXMPPropsWhithLegacyProps。在某些时候,我的应
我正在尝试使用 NSOperationQueue 在后台线程中执行一个方法,如下所示: NSOperationQueue *queue = [NSOperationQueue new]; NS
我是一名优秀的程序员,十分优秀!