相关疑难解决方法(0)

为什么Rust不允许使用可变别名?

Rust不允许使用这种代码,因为它不安全:

fn main() {
    let mut i = 42;
    let ref_to_i_1 = unsafe { &mut *(&mut i as *mut i32) };
    let ref_to_i_2 = unsafe { &mut *(&mut i as *mut i32) };

    *ref_to_i_1 = 1;
    *ref_to_i_2 = 2;
}
Run Code Online (Sandbox Code Playgroud)

如何通过对同一事物的多个可变引用来做一些不好的事情(例如,分段错误,未定义的行为等)?

我能看到的唯一可能的问题来自数据的生命周期.在这里,如果i是活着的,每个可变引用都应该没问题.

我可以看到引入线程时可能会出现什么问题,但是为什么即使我在一个线程中执行所有操作也会阻止它?

lifetime undefined-behavior rust

7
推荐指数
2
解决办法
532
查看次数

为什么要创建一个对引用的可变参考工作的可变引用?

我知道你不允许在Rust中同时创建两个对象的可变引用.我不完全理解为什么以下代码有效:

fn main() {
    let mut string = String::from("test");
    let mutable_reference: &mut String = &mut string;
    mutable_reference.push_str(" test");
    // as I understand it, this creates a new mutable reference (2nd?)
    test(&mut *mutable_reference);

    println!("{}", mutable_reference);
}

fn test(s: &mut String) {
    s.push_str(" test");
}
Run Code Online (Sandbox Code Playgroud)

rust

6
推荐指数
2
解决办法
365
查看次数

相互交织的范围如何造成“数据竞争”?

锈书大约有多个读者和多个可变对象引用的数据竞争情况,可能会导致问题进行会谈。

例如,这段代码:

fn main() {
    let mut x = 1;
    let r1 = &mut x;
    *r1 = 2;
    let r2 = &mut x;
    *r2 = 3;
    println!("{}", r1);
    println!("{}", r2);
}
Run Code Online (Sandbox Code Playgroud)

将被 Rust 编译器拒绝,因为r1r2作用域交织在一起。

但是这里有什么问题呢?我的意思是,这只是一个线程,没有“同时读取和写入”,因此所有这些语句都应严格按顺序执行并给出确定性的可重现结果。

reference mutability rust borrow-checker borrowing

1
推荐指数
1
解决办法
124
查看次数