购物网站服务器硬件配置,谷歌外贸平台有哪些,杭州做绒毛鉴定网站,莆田房产网在任意给定时间#xff0c;要么 只能有一个可变引用#xff0c;要么 只能有多个不可变引用。
不可变引用#xff08;shared reference#xff09;实现了Copy trait#xff0c;不会发生所有权转移可变引用#xff08;mutable reference#xff09;未实现#xff0c;会发…在任意给定时间要么 只能有一个可变引用要么 只能有多个不可变引用。
不可变引用shared reference实现了Copy trait不会发生所有权转移可变引用mutable reference未实现会发生所有权转移 let a: i32 1; let b: i32 a; // Copyprintln!({}, a) // a对应的值所有权未发生转移继续能用let c: mut i32 mut 1; let d: mut i32 c; // 未实现Copy, 此处发生move//println!({}, c); // 报错所有权发生转移 [选看] 一些有的没的自言自语
引用本质就是指针多个指针可以同时指向同一个地址单个指针的的销毁也不会影响到指向的地址
p.s 不要和非引用类型的变量搞混我们知道有些类型的数据本质也是指针比如String对于非引用类型的变量除开全局的静态变量在离开其所在的作用域时其指向的数据也会自动销毁为了避免二次释放(double free)问题的出现是不可以多个指针指向同一地址的这也是rust设计所有权机制的缘由。 一个最简单的例子
{let a .to_string(); // 字符串类型的数据a指向堆上分配一片空间let b a; // 字符串类型的数据b指向 同a相同的空间
}
// 离开作用域时变量a,b销毁其指向的堆内存空间自动回收。如果没有rust的所有权机制这里就会产生二次释放的问题又为了规避可能存在的数据竞争所以rust只允许同时存在一个可变的指针。