Swift 初始化';不安全指针<;UInt8>';结果是指针悬空

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

试图清除我的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(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”的初始化会导致指针悬空

  • 从“[UInt8]”到“UnsafePointer”的隐式参数转换将生成一个仅在调用“init(\)”期间有效的指针

  • 对数组使用“withUnsafeBufferPointer”方法,以便显式地将参数转换为对定义范围有效的缓冲区指针

  • 这是我的解决方案,更好吗

    第1版:

    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中的警告。