首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用仪器检测C泄漏(泄漏)

用仪器检测C泄漏(泄漏)
EN

Stack Overflow用户
提问于 2013-08-16 06:44:55
回答 2查看 359关注 0票数 0

我编写了一个测试代码来检查如何使用仪器(泄漏)。我已经创建了一个视图应用程序,并在单击按钮时加载了如下所示的新视图.

代码语言:javascript
复制
- (IBAction)btn_clkd:(id)sender {
    new_file *new = [[new_file alloc] init];

    if (new) {
        [self.navigationController pushViewController:new animated:YES];
        new = nil;
    }
}

在new_file ViewDidLoad方法中,我创建了如下所示的漏洞.

代码语言:javascript
复制
- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.

    char *c_mem = (char*) malloc(10000000);
    strcpy(c_mem, "TESTING");
    //   free(c_mem);
}

即使我使用ARC,分配的内存也是普通的code,使用后我还没有释放内存,即使我一次又一次地弹出和加载新的视图、工具(泄漏)没有检测到这段代码中的任何漏洞.是什么原因,我检查正确了吗?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-16 09:00:41

如果您的视图控制器已被解除分配(请验证),最终泄漏将检测到c_mem指针泄漏。

仪器可能不会立即发现这一点--因为它使用了检测泄漏的算法。

该算法基本上是搜索未引用的变量,这些变量看起来像指向堆的指针。如果碰巧有一个任意变量,比如p,它的值恰好是c_mem的值--那么仪器认为指针c_mem仍然是从p引用的--尽管p可能只包含任意数据,而不是引用c_mem

注意,仪器泄漏检测算法实际上更复杂,并可能发生变化并得到改进。

为了查找漏洞,我总是在循环中运行特殊的代码类单元测试。如果使用的内存没有及时增长,你通常是好的。您还可以使用泄漏的“快照”功能和分配的“标记生成”功能来检查堆的当前状态。

票数 1
EN

Stack Overflow用户

发布于 2013-08-16 06:52:33

当你弹出你的ViewController时,如果没有对它的引用,它就会被所有的变量自动释放。所以你才不会泄密。

看看你的控制器发生了什么,当你弹出它,使用泄漏仪器。你也可以在上面看到一些参考资料。对保留周期的检测也非常方便。

这里是关于如何使用仪器的完整参考。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18267329

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档