未分配要释放的指针[SWIFT] [英] Pointer being freed was not allocated [Swift]

查看:0
本文介绍了未分配要释放的指针[SWIFT]的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试读取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]的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆