【rust】part-2 所有权(引用、租借等)
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 所有权(引用、租借等)相关推荐
- 007 Rust死灵书笔记之引用与别名
介绍 本系列录制的视频主要放在B站上Rust死灵书学习视频 Rust相关的源码资料在:https://github.com/anonymousGiga 笔记内容 引用与别名 在Rust中,存在两种引用 ...
- Rust是如何实现内存安全的--理解RAII/所有权机制/智能指针/引用
不带自动内存回收(Garbage Collection)的内存安全是Rust语言最重要的创新,是它与其他语言最主要的区别所在,是Rust语言设计的核心. Rust希望通过语言的机制和编译器的功能,把程 ...
- Programming Rust Fast, Safe Systems Development(译) 引用(第五章 完)
Libraries cannot provide new inabilities. -Mark Miller 我们已经看到的所有指针类型 - 简单的Box 堆指针,以及String和Vec值内部的指针 ...
- 【rust】| 06——语言特性 | 所有权
系列文章目录 [rust]| 00--开发环境搭建 [rust]| 01--编译并运行第一个rust程序 [rust]| 02--语法基础 | 变量(不可变?)和常量 [rust]| 03--语法基础 ...
- Rust学习笔记(9)——Option的几个方法及所有权问题
在rust的设计中,Option的设计非常巧妙,避免了其它语言中常见的Null引起的各种错误和异常.但Option与所有权的结合,尤其是在一些特定的数据结构,如链表.图等设计中,加上引用的各种约束,就 ...
- 08.Rust引用和借用
Rust引用 接续上一章,Rust中使用元组进行返回string时,是使用了string本身,但是使用对象的引用作为参数能够更好执行. fn main() {let s1 = String::from ...
- rust 案例_理解Rust的引用与借用
困惑 接触Rust也一段时间了,但对References(引用) .borrowing(借用) . &关键字.ref关键字.* 关键字,这几个词非常困惑.常见的问题不在乎下面几条: & ...
- rust申请解封_参考 - Rust的确切自动解除引用规则是什么?
我正在学习/试验Rust,在我用这种语言找到的所有优雅中,有一个让我感到困惑并且看起来完全不合适的特点. 在进行方法调用时,Rust会自动取消引用指针. 我做了一些测试来确定确切的行为: struct ...
- 连续 3 年最受欢迎:Rust,香!
简介:我们在选择一种开发语言时会综合考量各方面的特性,根据实际的需求适当取舍.鱼和熊掌往往不可兼得,要想开发效率高,必然要牺牲性能和资源消耗,反之亦然.但是Rust却出其不意,令人眼前一亮!本文将从性 ...
- rust vs java_为什么我从Java切换到Rust
rust vs java 经过多年的Java开发,我最近开始学习Rust . 我要牢记的五个要点是: Rust感到很熟悉 引用很有意义 所有权会很有意义 货运很有帮助 编译器很棒 我绝对支持所有这些, ...
最新文章
- 重置SQLSERVER表的自增列,让自增列重新计数
- dos命令在vba中应用
- 【spring容器启动】之bean的实例化和初始化(文末附:spring循环依赖原理)
- 清除缓存 c语言_如何用C语言设置,清除和切换单个位?
- Apache工具包方法——Hex.encodeHexString(byte[] data)源码浅析
- 软件外部接口和内部接口_java中的内部类内部接口详解
- ROS入门笔记(十):编写与测试简单的消息发布器和订阅器(C++)
- java awt image_JAVA;使用java.awt.Image的不稳定性
- c语言无纸化测评答案,无纸化计算机二级C语言程序设计题库答案程序题
- 魔兽局域网协议UDP部分详细解释
- 集成电路--封装种类
- java怎么获取观看记录_java – 在Android手机上获取用户行为(应用历史记录,浏览历史记录等)...
- 微信小程序视频URL测试地址 MP4格式
- 基于Matlab仿真极化双基地雷达系统(附源码)
- Shor’s Algorithm 学习笔记
- 同等学力计算机 百度云,2020计算机二级题库百度云_圣考研网
- 浅析Android地理定位(GPS)
- SimpleDateFormat日期转换之12小时和24小时制
- Linux进程调用execve,实验:从整理上理解进程创建、可执行文件的加载和进程执行进程切换,重点理解分析fork、execve和...
- python itchat 抢红包-Python itchat模块在微信上的各种小应用
热门文章
- Graph-图可视化
- Windows10 本机电脑IPv4地址更改方法
- Linux命令-cat
- java 扩展库_JAVA API的扩展库详解
- php 修改某个字段的值,如何修改数据库表中的某一个字段的值呢?
- Unity整体性能优化篇 第(三)节:渲染优化 (GPU)
- MSE,ks,mAP,weight decay等名词解释
- 实训3:C++ 面向对象 - 构造函数与析构函数
- 中移链(基于EOS)实战:如何调用RPC接口组装交易、签名、上链以及查询上链结果
- MEM/MBA 考研高频单词总结(06)