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

Automatically handling disposing of unsafe allocated memory in Swift

在与低级操作系统功能交互的 Swift 程序中,我分配 "Unsafe" 内存块以缓冲数据。这些块存储在 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 系统的一些方法?

您可以定义一个 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 对象不见了。