JHHK

欢迎来到我的个人网站
行者常至 为者常成

内存泄露的检测

目录

内存泄露

一、Leaked Memory:
未被程序引用,但也无法释放的内存。

1、在MRC下比较常见,在ARC下由于有自动引用计数,在编译时会自动添加release,所以比较少见。
2、但在ARC机制下,使用CF或CG对象时,忘记手动调用CFRelease或CGRelease会出现。
3、手动开辟了堆空间,而没有手动释放也会出现。

二、Abandoned Memory:
被程序引用,无用但也无法释放的内存。

主要是循环引用
1、block的循环引用。
2、delegate使用strong造成的循环引用。
3、定时器传入target,没有调用invalid造成的循环引用。
4、两个对象互相持有造成的循环引用。

Leaks的使用

Leaks只能检测 leaks memory类型的内存泄露,而不能检测到循环引用。

- (void)createLeakedMemory {
    // 使用 malloc 动态分配内存
    char *leakedMemory = malloc(1024 * 1024); // 分配 1MB 的内存
    
    // 模拟使用这块内存
    strcpy(leakedMemory, "This is a memory leak example.");
    
    // 忘记释放内存,导致泄露
    // free(buffer); 应该调用,但这里没有
}
    func createLeakedMemory() {
        let pointer = UnsafeMutablePointer<Int>.allocate(capacity: 1024*1024) // 分配内存
        // 没有调用 pointer.deallocate(),导致内存泄露
         //pointer.deallocate() 应该调用,但这里没有
    }

提示:上述代码在模拟器演示,使用leaks工具可以捕获到内存泄露,真机不行。调用堆栈有时也并不能正常显示(dwarf with dsym file已经打开)

No stack trace is availabel for this leak;  it may have been allocated before the allocations instrument was attached
此泄漏没有可用的堆栈跟踪;它可能是在附加分配文书之前分配的

行者常至,为者常成!





R
Valine - A simple comment system based on Leancloud.