下面这段代码, 安全分析:
- ptr 申请了一个 Int 长度的内存
- ptr 赋值 10 到这块内存中
- ptr 释放掉这块内存, 代表这块内存可以被重新 alloc
- 赋值20 到 ptr 指向的这块内存
到这里发现即使 ptr.deallocate()
ptr 还会指向这块内存, 再 ptr.deallocate()
之后, 这部分代码就是隐藏的问题:
deallocate()
之后, 这块内存已经可以被重新 alloc, 但 ptr 依旧执行它, 并且赋值了20 到这块内存, 如果这块内存已经分配给其他 ptr1, 很大的问题出现了.
let ptr = UnsafeMutablePointer<Int>.allocate(capacity: 1)
ptr.initialize(to: 10)
print(ptr.pointee)
print(ptr)
ptr.deallocate()
ptr.pointee = 20
print(ptr.pointee)
print(ptr)
// print
10
0x00007fe9b9006470
20
0x00007fe9b9006470
Xcode 提供了 Address Sanitizer
来检测这个问题, 并且返回错误.
打开 Address Sanitizer
方式:
Scheme >> Edit Scheme >> Diagnostics >> Address Sanitizer
打开它在运行后会看到错误:
Thread 1: Use of deallocated memory
所以在正确的时间释放 unsafe ptr
是非常重要的.
c 中的指针对应的 swift 中的指针
c <--> swift
网友评论