首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >未分配要释放的指针[Swift]

未分配要释放的指针[Swift]
EN

Stack Overflow用户
提问于 2018-10-09 03:04:19
回答 1查看 3.3K关注 0票数 4

我正在尝试读取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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-09 03:37:20

问题是,缓冲区只分配一次,但每次都会释放

 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) {
        // ...
    }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52708579

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档