【问题标题】:how safe is UnsafeMutableRawPointer( variable )UnsafeMutableRawPointer( 变量 ) 有多安全
【发布时间】:2019-03-16 02:34:02
【问题描述】:

如果我想获得一个变量的 unsafemutablerawpointer。 然而,如果不创建副本或缓冲区,那么最好/有效的方法是什么?

下面的例子有效!

var number:UInt = 5

let numberPointer = UnsafeMutableRawPointer(&number)

var pointer:UnsafeMutablePointer<UInt8> = numberPointer.bindMemory(to: UInt8.self, capacity: size)

pointer[0] = 88

print(numberPointer) // 88 

来自苹果的文档:

docs

【问题讨论】:

  • 正如您在 Apple 文档中找到的那样。您的示例似乎在某些特定条件下有效。不幸的是,这种情况没有记录在案并导致未定义的行为。你想要什么答案? ,这不安全。 或者其他一些安全的方法?
  • 是的,还有什么其他安全方法可以有效地从任何变量(例如 float、int、uint、int8 等)中提取 UnsafeMutableRawPointer。

标签: swift unsafemutablepointer


【解决方案1】:

它不像 Apple 的文档或我的评论那样安全。

如果你想以某种安全的方式来做,你可能需要这样写:

var number: UInt = 5

let size = MemoryLayout.size(ofValue: number)
withUnsafeMutableBytes(of: &number) {numberUmbp in
    let numberPointer = numberUmbp.baseAddress!
    let pointer: UnsafeMutablePointer<UInt8> = numberPointer.bindMemory(to: UInt8.self, capacity: size)

    pointer[0] = 88
} //`pointer` (or `numberPointer`) is guaranteed to be valid only inside this closure

print(number) // 88

当然,指针pointer只在闭包内部有效。

如果你想提取一些更稳定和永久的地址,你不能避免创建副本或缓冲区,在当前的 Swift 规范中。

【讨论】:

    猜你喜欢
    • 2012-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-29
    • 1970-01-01
    • 2012-12-16
    相关资源
    最近更新 更多