Swift 初始化';不安全指针<;UInt8>';结果是指针悬空
试图清除我的SWIFT 5/XCODE项目中的一些警告,我被困在这一条上:Swift 初始化';不安全指针<;UInt8>';结果是指针悬空,swift,xcode,swift5,Swift,Xcode,Swift5,试图清除我的SWIFT 5/XCODE项目中的一些警告,我被困在这一条上: let sendBytes:[UInt8] = [0x0, 0x0, 0x5, 0x0] let msgData = Data(bytes: UnsafePointer<UInt8>(sendBytes), count: sendBytes.count) socket.write(msgData, withTimeout: -1.0, tag: 0) socket.readData(withTimeo
let sendBytes:[UInt8] = [0x0, 0x0, 0x5, 0x0]
let msgData = Data(bytes: UnsafePointer<UInt8>(sendBytes), count: sendBytes.count)
socket.write(msgData, withTimeout: -1.0, tag: 0)
socket.readData(withTimeout: -1.0, tag: 0)
let sendBytes:[UInt8]=[0x0,0x0,0x5,0x0]
让msgData=Data(字节:UnsafePointer(sendBytes),计数:sendBytes.count)
socket.write(msgData,带超时:-1.0,标记:0)
socket.readData(带超时:-1.0,标记:0)
对于“UnsafePointer”,我得到以下警告和两条建议:
“UnsafePointer”的初始化会导致指针悬空
let sendBytes:[UInt8] = [0x0, 0x0, 0x5, 0x0]
let uint8Pointer = UnsafeMutablePointer<UInt8>.allocate(capacity: sendBytes.count)
uint8Pointer.initialize(from: sendBytes, count: sendBytes.count)
let msgData = Data(bytes: uint8Pointer, count: sendBytes.count)
socket.write(msgData, withTimeout: -1.0, tag: 0)
socket.readData(withTimeout: -1.0, tag: 0)
let sendBytes:[UInt8] = [0x0, 0x0, 0x5, 0x0]
let uint8Pointer = UnsafeMutablePointer<UInt8>.allocate(capacity: sendBytes.count)
uint8Pointer.initialize(from: sendBytes, count: sendBytes.count)
let msgData = Data(bytes: uint8Pointer, count: sendBytes.count)
socket.write(msgData, withTimeout: -1.0, tag: 0)
socket.readData(withTimeout: -1.0, tag: 0)
uint8Pointer.deallocate()
let sendBytes:[UInt8]=[0x0,0x0,0x5,0x0]
let uint8Pointer=UnsafeMutablePointer.allocate(容量:sendBytes.count)
uint8Pointer.initialize(from:sendBytes,count:sendBytes.count)
让msgData=Data(字节:uint8指针,计数:sendBytes.count)
socket.write(msgData,带超时:-1.0,标记:0)
socket.readData(带超时:-1.0,标记:0)
第2版:
let sendBytes:[UInt8] = [0x0, 0x0, 0x5, 0x0]
let uint8Pointer = UnsafeMutablePointer<UInt8>.allocate(capacity: sendBytes.count)
uint8Pointer.initialize(from: sendBytes, count: sendBytes.count)
let msgData = Data(bytes: uint8Pointer, count: sendBytes.count)
socket.write(msgData, withTimeout: -1.0, tag: 0)
socket.readData(withTimeout: -1.0, tag: 0)
let sendBytes:[UInt8] = [0x0, 0x0, 0x5, 0x0]
let uint8Pointer = UnsafeMutablePointer<UInt8>.allocate(capacity: sendBytes.count)
uint8Pointer.initialize(from: sendBytes, count: sendBytes.count)
let msgData = Data(bytes: uint8Pointer, count: sendBytes.count)
socket.write(msgData, withTimeout: -1.0, tag: 0)
socket.readData(withTimeout: -1.0, tag: 0)
uint8Pointer.deallocate()
let sendBytes:[UInt8]=[0x0,0x0,0x5,0x0]
let uint8Pointer=UnsafeMutablePointer.allocate(容量:sendBytes.count)
uint8Pointer.initialize(from:sendBytes,count:sendBytes.count)
让msgData=Data(字节:uint8指针,计数:sendBytes.count)
socket.write(msgData,带超时:-1.0,标记:0)
socket.readData(带超时:-1.0,标记:0)
uint8Pointer.deallocate()
自Swift 3以来,可以使用UInt8
数组简单地初始化数据
实例
let sendBytes:[UInt8] = [0x0, 0x0, 0x5, 0x0]
let msgData = Data(sendBytes)
您是否在问为什么会收到此警告或如何修复它?对于前者(如果不清楚),
sendBytes
将在该函数(可能是init
)返回时解除分配。此时,指向它的UnsafePointer
不再有效(它指向解除分配的内存),因此如果msgData
稍后尝试使用它,将导致“坏”行为。嗨,Alex--我在上面添加了我的解决方案--这是更好的处理方法吗?这确实解决了范围问题,但现在,除非您在ptr上手动调用deallocate
(在使用完之后),否则将出现内存泄漏。来自docs:“你有责任通过不安全的指针处理任何内存的生命周期,以避免泄漏或未定义的行为。”明白了!我在上面添加了版本2——在发送字节后,我释放了指针。如果不确切知道socket.write
的作用,就不可能确切地说(例如,如果它将ptr存储在全局变量中,并稍后尝试访问它,这将中断);但是假设它只是写数据,那么看起来不错。如果您是这样使用msgData
,那么您的原始代码可能也很好(因为msgData
仅在超出范围之前使用)Bam!这是非常旧的代码,只需删除“UnsafePointer”就可以删除XCODE中的警告。