在与底层操作系统功能进行交互的Swift程序中,我分配了“不安全”内存块以缓冲数据。这些块存储在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)
一旦process1和process2完成分配后,如何确保已分配的块被处理掉?
在C ++中,我将使用shared_ptr
来跟踪分配。 Swift可以使用类似的功能吗?使用现有ARC系统的某种方式?
答案 0 :(得分:1)
您可以改为定义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
对象不见了。