在Swift中自动处理不安全分配的内存的处置

时间:2018-07-18 12:23:49

标签: swift memory-management unsafe-pointers

在与底层操作系统功能进行交互的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系统的某种方式?

1 个答案:

答案 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 对象不见了。