swift - 未分配正在释放的指针 [Swift]

标签 swift tcp tcpclient

我正在尝试读取 TCP 套接字连接中的长字符串。 对于读取短长度字符串,它工作正常。但是当我试图发送长长度的 base64 编码图像时。它正在崩溃,我试图增加到 maxReadLength = 10000,但它仍然无法正常工作。

阅读收到的消息

 private func readAvailableBytes(stream: InputStream) {
            let buffer = UnsafeMutablePointer<UInt8>.allocate(capacity: maxReadLength)

            while stream.hasBytesAvailable {
                let numberOfBytesRead = inputStream.read(buffer, maxLength: maxReadLength)

                if numberOfBytesRead < 0 {
                    if let _ = inputStream.streamError {
                        break
                    }
                }

           ❌ Crashing in  below line 👇 ❌

               if let reciviedMsg = String(bytesNoCopy: buffer,
                                         length: numberOfBytesRead,
                                         encoding: .ascii,
                                         freeWhenDone: true)
               {
                   delegate?.scoktDidRecivceNewMessagew(message: reciviedMsg)
                }

            }
        }

错误

malloc: *** error for object 0x101890c00: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug

最佳答案

问题是缓冲区只分配一次,但每次都释放 什么时候

 String(bytesNoCopy: buffer, length: numberOfBytesRead, encoding: .ascii, freeWhenDone: true)

被调用。这是一个演示问题的简短的独立示例:

let buffer = UnsafeMutablePointer<UInt8>.allocate(capacity: 4)
memcpy(buffer, "abcd", 4)

var s = String(bytesNoCopy: buffer, length: 4, encoding: .ascii, freeWhenDone: true)
// OK

s = String(bytesNoCopy: buffer, length: 4, encoding: .ascii, freeWhenDone: true)
// malloc: *** error for object 0x101d8dc40: pointer being freed was not allocated

使用 freeWhenDone: false 是解决问题的一种选择,但请注意 你最终必须释放缓冲区。

另一种方法是使用Array(或Data)作为缓冲区,这是自动的 函数返回时释放。示例:

var buffer = [UInt8](repeating: 0, count: maxReadLength)
while inputStream.hasBytesAvailable {
    let numberOfBytesRead = inputStream.read(&buffer, maxLength: maxReadLength)
    if numberOfBytesRead < 0 {
        break
    }
    if let receivedMsg = String(bytes: buffer[..<numberOfBytesRead], encoding: .ascii) {
        // ...
    }
}

关于swift - 未分配正在释放的指针 [Swift],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52708579/

相关文章:

ios - 无法将 Firebase 导入 Swift 类

ios - 动态调整内部文本大小以适应后动态调整 UILabel 框架高度

node.js - erlang 和 nodejs 之间通过 tcp 传递的数据

ios - Popover 通知 View ,独立于 swift 中的当前 View Controller

ios - 如何在协议(protocol)中设置读写内部、只读外部属性

c - 在服务器模式下如何发现连接的 TCP 套接字的本地 IP 地址

java - 通过 TCP 发送两种不同类型的数组

.net - 是 200 - 400 毫秒 "slow"TCP 延迟? (不平)

.net - VB.NET 使用 system.net.tcpclient 编写 telnet 客户端

c# - TCPClient 异常的新实例