自动处理 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
对象不见了。
在与低级操作系统功能交互的 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
对象不见了。