我有一个C ++类,我正在使用我的iPhone应用程序中的Objective-C ++控制器。 C ++类对某些数据进行一些计算,返回结果,然后完成 - 但它会像疯了一样泄漏。我想知道我是否能够以某种方式利用Memory Zones(又名malloc区域又名allocWithZone)来解决这个问题。我的想法是将ObjC ++对象分配到一个新区域,然后以某种方式让C ++对象全部在这个新区域中自动创建。然后,当它返回时,我会杀死该区域,并且所有内存都将自动恢复,即使它已被泄露。
但是:文档似乎表明我是否在新区X中分配了一个对象,它所分配的对象不也会自动也在X区。如果这有意义,有没有人知道如何要覆盖该行为,以便该对象的所有后续alloc和malloc都位于新区域X?
编辑:
我应该注意,该线程将主要运行C ++代码,一个庞大的代码库,此时杀死它中的所有泄漏是不经济的,因为它自动从Java转换而且像疯了一样泄漏到处都是(需要重构......)。感谢“只是修复你的漏洞”的建议,但目前这不切实际。
内存没有通过ObjC分配泄露,但主要是通过C ++数组新调用(也有几个直接的malloc)。如果这有所不同。
答案 0 :(得分:7)
最初,Objective-C中的区域旨在使开发人员能够在区域中分配一堆相关对象,然后将它们全部释放,而无需单独释放每个实例。
在实践中,这被证明是不切实际的。特别是一旦从Object转移到NSObject(从NeXTSTEP到OpenStep)。
现实情况是,应用程序中的对象图通常足够复杂,以至于子图的总区域隔离几乎是不可能的。特别是,您不能直接或间接地从Apple的框架中分配任何对象并保留对它们的引用,因为您无法控制所述对象的基于区域的分配。
所以,不,不要那样做。修复你的泄漏。没有灵丹妙药/机制可以避免让你的代码真正起作用。
答案 1 :(得分:3)
只需修复内存泄漏......
答案 2 :(得分:1)
是不是要编码以使不任何泄漏?不打扰清理内存泄漏是开展业务的坏方法!
答案 3 :(得分:1)
你所讨论的是区域的原始思想的一部分,但这方面并没有那么好。
避免泄漏的方法只是为了避免泄漏。释放你的malloc,释放你需要释放的对象。
答案 4 :(得分:1)
防止泄漏真的不是那么难。它发生了,但你找到泄漏并修复它。创造另一个可能复杂的系统,以避免一点点的深谋远虑和纪律,是不值得的。