在与低级操作系统功能交互的 Swift 程序中,我分配“不安全”内存块以缓冲数据。这些 block 存储在一个 struct
中,可以在程序的各个部分传递。我如何跟踪这些副本并确保在所有副本完成后释放内存块?
示例代码:
struct Packet {
var memoryBlock : UnsafeRawPointer
init () {
let block = UnsafeMutableRawPointer.allocate (bytes: 128, alignedTo: 4)
someProcessThatFillsTheBuffer (block);
memoryBlock = UnsafeRawPointer(block);
}
}
let packet = Packet()
process1.handle (packet); process2.handle (packet)
我如何确保分配的 block 在 process1 和 process2 都完成后被释放?
在 C++ 中,我会使用 shared_ptr
来跟踪分配。 Swift 有类似的东西吗?使用现有 ARC 系统的某种方式来做到这一点?
最佳答案
您可以定义一个 class
并在 deinit
中释放内存:
class Packet {
var memoryBlock : UnsafeRawPointer
init() {
let block = UnsafeMutableRawPointer.allocate(byteCount: 128, alignment: 4)
//someProcessThatFillsTheBuffer (block);
memoryBlock = UnsafeRawPointer(block);
}
deinit {
memoryBlock.deallocate()
}
}
现在 Packet
的实例是对一个对象的引用并且可以是
转了一圈。 ARC(自动引用计数)确保在最后一次引用时调用deinit
对象不见了。
关于swift - 在 Swift 中自动处理不安全分配的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51401949/