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

标签 swift memory-management unsafe-pointers

在与低级操作系统功能交互的 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/

相关文章:

ios - 不涉及代码的无限内存增长

swift - 警告: Initialization of 'UnsafeBufferPointer<T>' results in a dangling buffer pointer

swift - 无法理解 withUnsafeBytes 方法的工作原理

c# - 为什么在这种情况下为 for 循环使用指针性能更高?

ios - Game Center 邀请立即失败

swift - 如何在 WKWebView 中使用带有钥匙串(keychain)访问的自动填充

ios - 如何为多个设备实现核心蓝牙功能?

ios - 单击按钮时无法播放一系列图像

Java - 从内存中卸载媒体

memory-management - 性能顺便说一句。堆堆动态数组