警告:"UnsafeBufferPointer< T>"的初始化导致悬空的缓冲区指针 [英] Warning: Initialization of 'UnsafeBufferPointer<T>' results in a dangling buffer pointer

查看:516
本文介绍了警告:"UnsafeBufferPointer< T>"的初始化导致悬空的缓冲区指针的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在更新到Swift 5.2/Xcode 11.4之后,出现了以下代码的警告:

After update to Swift 5.2 / Xcode 11.4 got a warning to following code:

extension Data {

    init<T>(from value: T) {
        var value = value
        let pointer = UnsafeBufferPointer(start: &value, count: 1)
        self.init(buffer: pointer)
    }

    func to<T>(type: T.Type) -> T {
        return self.withUnsafeBytes { $0.load(as: T.self) }
    }
}

在线让指针= UnsafeBufferPointer(开始:&值,计数:1)我得到

'UnsafeBufferPointer'的初始化导致悬空的缓冲区指针

Initialization of 'UnsafeBufferPointer' results in a dangling buffer pointer

我可以使用@silenceWarning,但这是肮脏的解决方案.也许我需要将指针存储在某个地方并在将来清理它?

I can use @silenceWarning but it's dirty solution. Maybe I need to store pointer somewhere and clean it in the future?

推荐答案

我也遇到了这些烦人的警告.

I also met these annoying warnings.

var str = "aaaaabbbbbccccc"
var num1 = 1
var num2 = 22

var data = Data()
// Initialization of 'UnsafeBufferPointer<String>' results in a dangling buffer pointer
data.append(UnsafeBufferPointer(start: &str, count: 1)) 
// Initialization of 'UnsafeBufferPointer<Int>' results in a dangling buffer pointer
data.append(UnsafeBufferPointer(start: &num1, count: 1))
// Initialization of 'UnsafeBufferPointer<Int>' results in a dangling buffer pointer 
data.append(UnsafeBufferPointer(start: &num2, count: 1)) 

考虑@greg的回答,我将Data.append放入withUnsafePointer的闭包中,它不再显示警告.

Considering @greg's answer, I put the Data.append into withUnsafePointer's closure, and it does not show warnings anymore.

withUnsafePointer(to: &str) { data.append(UnsafeBufferPointer(start: $0, count: 1)) } // ok
withUnsafePointer(to: &num1) { data.append(UnsafeBufferPointer(start: $0, count: 1)) } // ok
withUnsafePointer(to: &num2) { data.append(UnsafeBufferPointer(start: $0, count: 1)) } // ok

这是扩展名

extension Data {
    init<T>(value: T) {
        self = withUnsafePointer(to: value) { (ptr: UnsafePointer<T>) -> Data in
            return Data(buffer: UnsafeBufferPointer(start: ptr, count: 1))
        }
    }

    mutating func append<T>(value: T) {
        withUnsafePointer(to: value) { (ptr: UnsafePointer<T>) in
            append(UnsafeBufferPointer(start: ptr, count: 1))
        }
    }
}

这篇关于警告:"UnsafeBufferPointer&lt; T&gt;"的初始化导致悬空的缓冲区指针的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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