美文网首页
内存访问冲突

内存访问冲突

作者: 纳兰沫 | 来源:发表于2019-09-25 17:17 被阅读0次

内存访问冲突会在两个访问满足下列条件时发生

1.至少一个是写入操作
2.他们访问的是同一块内存
3.他们的访问时间重叠(比如在同一个函数内)
不存在内存访问冲突
//不存在内存访问冲突
func plus(_ num: inout Int) -> Int {
    return num + 1
}
var number = 1
number = plus(&number)
存在内存访问冲突
var step = 1
func increment(_ num: inout Int) {
    num += step
}
increment(&step)
func balance(_ x: inout Int, _ y: inout Int) {
    let sum = x + y
    x = sum / 2
    y = sum - x
}

var num1 = 42
var num2 = 30
balance(&num1, &num2)
balance(&num1, &num1)
错误信息.png
解决内存访问冲突
var step = 1
func increment(_ num: inout Int) {
    num += step
}
var copyOfStep = step
increment(&copyOfStep)
step = copyOfStep

如果下面的条件可以满足,说明重叠访问结构体的属性是安全的

- 只访问实例存储属性 不是计算属性或者类属性
- 结构体是局部变量而非全局变量
- 结构体要么没有被闭包捕获要么只被非逃逸闭包捕获

相关文章

  • 十八、内存访问冲突、指针

    内存访问冲突(Conflicting Access to Memory) 产生内存访问冲突的条件 内存访问冲突会在...

  • 内存访问冲突

    内存访问冲突会在两个访问满足下列条件时发生 不存在内存访问冲突 存在内存访问冲突 解决内存访问冲突 如果下面的条件...

  • Swift十六(1: 内存访问冲突,2: 指针)

    1 内存访问冲突2 swift指针 一: 内存访问冲突 内存访问冲突会在两个访问满足下列条件时发生:至少一个是写入...

  • Swift5.0 - day8-内存访问冲突、指针

    一、内存访问冲突 1.1、内存访问冲突会在两个访问满足下列条件时发生(1)、至少一个是写入操作(2)、它们访问的是...

  • Swift 中的内存安全性

    内存安全 inout 参数访问冲突 在函数体内,同时读、写 stepSize 这块内存区域。 inout 参数访问...

  • 从零学习Swift 14: Swift 中指针的使用

    一: 内存访问冲突 如果两个操作同时满足下面几个条件,就会产生内存访问冲突: 至少一个是写入操作 访问的是同一块内...

  • 内存访问冲突、指针

    上面代码是在全局区 _?表示绑定非空的值 v?表示绑定非空的值 is只是用来判断是否是某个类型,as是转成某个类型...

  • 26.内存安全

    内存访问的三个性质:读还是写,访问的内存地址,访问的时长 只要包含以下情况中的任意两种,都会造成 访问冲突: 至少...

  • Swift开发,内存访问冲突

  • Memory Safety

    内存访问分为读写,在以下三种条件同时满足时会造成内存访问冲突。1.至少一个是写2.访问同一块地址3.访问期间重叠 ...

网友评论

      本文标题:内存访问冲突

      本文链接:https://www.haomeiwen.com/subject/iealyctx.html