0.【rust】part-2 所有权

1.所有权

前言:
为了避免垃圾回收而产生的概念,在编译阶段便会优化内存使用,删减不必要的内存使用,达到不需要GC机制的效果。
GCC -O等方式有些类似,在编译时就优化代码。rust会往编译程序中自动添加内存回收程序段。

1.变量交互:move clone

1."编译时自动调用内存释放",栈中的数据通过mv就可以完成变量交互,例如:
let  a = 100;
let  b = a; // a, b均可访问
2."需要在栈中的数据"超过变量范围就会被清除
let s1 = string::from("string");
let s2 = s1 ; //此时s1 就被mv到s2了,再访问s1就是非法的了
3."需要堆中复制的数据",可以从用cloen的方式复制数据。
let s1 = string::from("string");
let s2 = s1.cloen();//此时s1 s2 都可访问,二者在堆中有两份

2.返回值所有权

返回值的所有权,返回到主函数调用的地方,并不会被直接释放。

# demo 1 :子函数中定义,移动到主函数中使用
fn main() {// 1.get retlet s0 = get_ownership();println!("s0 = {}",s0);
}
fn get_ownership()->String{let s = String::from("String 0");//return s;s
}# demo 2 :主函数中定义,子函数获取所有权,再返回调用函数时,源参数所有权已经被更改,源s1无所有权。
fn main() {// 2.get _set_retlet s1 = String::from("string 1");let s2 = get_back_str(s1);//println!("s1 = {}",s1); // error : value borrowed here after moveprintln!("s2 = {}",s2);
}
fn get_back_str(s1:String)->String{//return s1;s1  //Tip
}
# "源码-2"

2.引用、租借、续租

类似指针,“变量“间接访问的一种方式。
租借无法获得所有权,无法通过该变量修改源“变量”的值。

1.demo

fn main() {//3.reflet r0 = String::from("ref 0 ");let r1 = &r0; // refprintln!("r0 = {}",r0);// ownershipprintln!("r1 = {}",r1);// no ownershiplet r2 = r0;// move ownership//println!("r0 = {}",r0);// no ownership // error//println!("r1 = {}",r1);// no ownership // errorprintln!("r2 = {}",r2);  // ownershipr1 = &r2;//re refprintln!("r1 = {}",r1);
}

2.通过引用的变量修改源变量

用 &mut 修饰可变的引用类型

let mut src_str = String::from("xxxxx");//源变量需要支持修改
let ref_str = &mut src_str;// 通过&mut修饰
//let ref_str_ = &mut src_str;//错误的,可变引用不允许多重引用,error!
let s1 = &src_str;// 不可变引用 允许多重引用
let s2 = &src_str;
let s3 = &src_str;
# "源码-3"

3.“垂悬引用”

“垂悬引用”:不确定源变量是否被释放的应用

# cmd : 不确定被引用的变量是否被释放的引用
fn main(){let j = _func();
}
fn _func()=->&String{let i = String::from("string");&i // Error ;\
}
# ps : i 的作用域为_func函数内,返回的不是值,是引用,而被引用的变量i已经被释放了,导致main中是个空引用(类似于野指针)
# "源码-4"

PS :附件-源码

1.源码-1

func : move 和 clone在堆中的问题

fn main() {func_mv();func_clone();
}fn func_mv(){let s1 = String::from("s1");let s2 = s1;//println!("{}",s1);//error , value borrwed here after moveprintln!("{}",s2);
}
fn func_clone(){let s1 = String::from("s1");let s2 = s1.clone();println!("s1 = {}",s1);println!("s2 = {}",s2);
}

2.源码-2

函数返回值相关所有权问题

fn main() {// 1.get retlet s0 = get_ownership();println!("s0 = {}",s0);// 2.get _set_retlet s1 = String::from("string 1");let s2 = get_back_str(s1);//println!("s1 = {}",s1); // error : value borrowed here after moveprintln!("s2 = {}",s2);
}fn get_ownership()->String{let s = String::from("String 0");//return s;s
}fn get_back_str(s1:String)->String{//return s1;s1  //Tip
}

3.源码-3

可变引用、不可变引用

fn main(){//4.mut varlet mut m_r0 = String::from("mut m_r0");let m_r1 = &mut m_r0;println!("m_r1 = {}",m_r1);m_r1.push_str(" , add var ");println!("m_r1 = {}",m_r1);//let m_r2 = &mut m_r0; //error !let r01 = &m_r0;let r02 = &m_r0;let r03 = &m_r0;println!("r01~r03 = {} , {} , {}",r01 , r02 ,r03);
}

4.源码-4

“垂悬引用”:不确定源变量是否被释放的应用.
PS : “垂悬引用"无法通过编译

fn main(){//5. dangling ref/*let d_s1 = dang_ref();println!("{}",d_s1);//error*/
}
/*
fn dang_ref()->&String{let s = String::from("string");&s// error
}
*/

【rust】part-2 所有权(引用、租借等)相关推荐

  1. 007 Rust死灵书笔记之引用与别名

    介绍 本系列录制的视频主要放在B站上Rust死灵书学习视频 Rust相关的源码资料在:https://github.com/anonymousGiga 笔记内容 引用与别名 在Rust中,存在两种引用 ...

  2. Rust是如何实现内存安全的--理解RAII/所有权机制/智能指针/引用

    不带自动内存回收(Garbage Collection)的内存安全是Rust语言最重要的创新,是它与其他语言最主要的区别所在,是Rust语言设计的核心. Rust希望通过语言的机制和编译器的功能,把程 ...

  3. Programming Rust Fast, Safe Systems Development(译) 引用(第五章 完)

    Libraries cannot provide new inabilities. -Mark Miller 我们已经看到的所有指针类型 - 简单的Box 堆指针,以及String和Vec值内部的指针 ...

  4. 【rust】| 06——语言特性 | 所有权

    系列文章目录 [rust]| 00--开发环境搭建 [rust]| 01--编译并运行第一个rust程序 [rust]| 02--语法基础 | 变量(不可变?)和常量 [rust]| 03--语法基础 ...

  5. Rust学习笔记(9)——Option的几个方法及所有权问题

    在rust的设计中,Option的设计非常巧妙,避免了其它语言中常见的Null引起的各种错误和异常.但Option与所有权的结合,尤其是在一些特定的数据结构,如链表.图等设计中,加上引用的各种约束,就 ...

  6. 08.Rust引用和借用

    Rust引用 接续上一章,Rust中使用元组进行返回string时,是使用了string本身,但是使用对象的引用作为参数能够更好执行. fn main() {let s1 = String::from ...

  7. rust 案例_理解Rust的引用与借用

    困惑 接触Rust也一段时间了,但对References(引用) .borrowing(借用) . &关键字.ref关键字.* 关键字,这几个词非常困惑.常见的问题不在乎下面几条: & ...

  8. rust申请解封_参考 - Rust的确切自动解除引用规则是什么?

    我正在学习/试验Rust,在我用这种语言找到的所有优雅中,有一个让我感到困惑并且看起来完全不合适的特点. 在进行方法调用时,Rust会自动取消引用指针. 我做了一些测试来确定确切的行为: struct ...

  9. 连续 3 年最受欢迎:Rust,香!

    简介:我们在选择一种开发语言时会综合考量各方面的特性,根据实际的需求适当取舍.鱼和熊掌往往不可兼得,要想开发效率高,必然要牺牲性能和资源消耗,反之亦然.但是Rust却出其不意,令人眼前一亮!本文将从性 ...

  10. rust vs java_为什么我从Java切换到Rust

    rust vs java 经过多年的Java开发,我最近开始学习Rust . 我要牢记的五个要点是: Rust感到很熟悉 引用很有意义 所有权会很有意义 货运很有帮助 编译器很棒 我绝对支持所有这些, ...

最新文章

  1. 重置SQLSERVER表的自增列,让自增列重新计数
  2. dos命令在vba中应用
  3. 【spring容器启动】之bean的实例化和初始化(文末附:spring循环依赖原理)
  4. 清除缓存 c语言_如何用C语言设置,清除和切换单个位?
  5. Apache工具包方法——Hex.encodeHexString(byte[] data)源码浅析
  6. 软件外部接口和内部接口_java中的内部类内部接口详解
  7. ROS入门笔记(十):编写与测试简单的消息发布器和订阅器(C++)
  8. java awt image_JAVA;使用java.awt.Image的不稳定性
  9. c语言无纸化测评答案,无纸化计算机二级C语言程序设计题库答案程序题
  10. 魔兽局域网协议UDP部分详细解释
  11. 集成电路--封装种类
  12. java怎么获取观看记录_java – 在Android手机上获取用户行为(应用历史记录,浏览历史记录等)...
  13. 微信小程序视频URL测试地址 MP4格式
  14. 基于Matlab仿真极化双基地雷达系统(附源码)
  15. Shor’s Algorithm 学习笔记
  16. 同等学力计算机 百度云,2020计算机二级题库百度云_圣考研网
  17. 浅析Android地理定位(GPS)
  18. SimpleDateFormat日期转换之12小时和24小时制
  19. Linux进程调用execve,实验:从整理上理解进程创建、可执行文件的加载和进程执行进程切换,重点理解分析fork、execve和...
  20. python itchat 抢红包-Python itchat模块在微信上的各种小应用

热门文章

  1. Graph-图可视化
  2. Windows10 本机电脑IPv4地址更改方法
  3. Linux命令-cat
  4. java 扩展库_JAVA API的扩展库详解
  5. php 修改某个字段的值,如何修改数据库表中的某一个字段的值呢?
  6. Unity整体性能优化篇 第(三)节:渲染优化 (GPU)
  7. MSE,ks,mAP,weight decay等名词解释
  8. 实训3:C++ 面向对象 - 构造函数与析构函数
  9. 中移链(基于EOS)实战:如何调用RPC接口组装交易、签名、上链以及查询上链结果
  10. MEM/MBA 考研高频单词总结(06)