RUST语言值所有权之内存复制与移动

1.RUST中每个值都有一个所有者,每次只能有一个所有者

String::from函数会为字符串hello分配一块内存

内存示例如下:

在内存分配前调用s1正常输出

在分配s1给s2后调用报错

因为s1分配给s2后,s1的指向自动失效

复制代码
s1被move到s2  s1自动释放

字符串克隆使用

所有整数类型,布尔类型 ,所有浮点类型,字符类型,元组,等,这些类型实现了copy特性

在分配时原来的变量值不会被移动

如果元组中也实现Copy.例如, (i32, i32)实现Copy,那么不会被移动

(i32, String)不实现copy将会被移动,因为String不实现copy特性

复制与移动示例

字符串类型未实现copy特性,会被移动

可使用clone或者返回字符串所有权

克隆

返回字符串所有权:

所有权转移

完整示例代码:

rust 复制代码
fn main() {
    println!("RUST语言内存与堆栈关系认识(值所有权)");
    let str = "HelloWorld";//str指针指向HelloWorld的内存
    println!("{}",str);
    //String::from会请求内存
    let str1 =String::from("Hello");//不可变
    let mut str2=String::from("Ok,");//可变
    str2.push_str(str);//连接字符串
    println!("{}",str2);
    //在Rust中一旦拥有内存的变量超出范围,内存就会自动返回,RUST会调用drop函数释放内存
    let x=888;
    let y=x;//y会复制x的副本
    println!("{},{}",x,y);
    let s1=String::from("hello");//会分配一块内存来保存字符串hello
    println!("分配s1给s2前:{}",s1);
    let s2=s1;
    println!("{}",s2);//s1被move到s2  s1自动释放
    //要使s1分配给s2后,不释放,使用clone方法
    let s1 = String::from("OK");
    let s2=s1.clone();
    println!("{},{}",s1,s2);

    let mystr=String::from("Hello,RUST");//mystr指向Hello,RUST
    let mystr2=mystr.clone();//在被移动前克隆副本
    test_allow_string(mystr);//已移动到函数中,此时mystr无效
    //println!("{}",mystr);//因为mystr已移动,这里会报错
    println!("{}",mystr2);//因为mystr克隆副本
    let mynum:i64 = 999;
    test_allow_num(mynum);//会复制mynum副本到函数中
    println!("{}",mynum);
    let mystr3 = mystr2.clone();
    //此处调用后mystr2所有权被移动
    println!("{}",test_allow_string_return(mystr2));
    //通过元组转移所有权
    let (s,n) = test_allow_string_return_more(mystr3);
    println!("{},{}",s,n);
}

fn test_allow_string(str:String){
    println!("test_allow_string:{}",str);
}

//返回传入的字符串
fn test_allow_string_return(str:String) -> String{
    str
}

//传入字符串,返回元组
fn test_allow_string_return_more(str:String) -> (String,usize){
    let n = str.len();
    (str,n)//返回元组
}

fn test_allow_num(num:i64){
    println!("test_allow_num:{}",num);
}
相关推荐
求知若饥6 分钟前
NestJS 项目实战-权限管理系统开发(六)
后端·node.js·nestjs
数据小爬虫@9 分钟前
如何高效利用Python爬虫按关键字搜索苏宁商品
开发语言·爬虫·python
ZJ_.11 分钟前
WPSJS:让 WPS 办公与 JavaScript 完美联动
开发语言·前端·javascript·vscode·ecmascript·wps
Narutolxy16 分钟前
深入探讨 Go 中的高级表单验证与翻译:Gin 与 Validator 的实践之道20241223
开发语言·golang·gin
Hello.Reader24 分钟前
全面解析 Golang Gin 框架
开发语言·golang·gin
禁默34 分钟前
深入浅出:AWT的基本组件及其应用
java·开发语言·界面编程
Code哈哈笑44 分钟前
【Java 学习】深度剖析Java多态:从向上转型到向下转型,解锁动态绑定的奥秘,让代码更优雅灵活
java·开发语言·学习
gb42152871 小时前
springboot中Jackson库和jsonpath库的区别和联系。
java·spring boot·后端
程序猿进阶1 小时前
深入解析 Spring WebFlux:原理与应用
java·开发语言·后端·spring·面试·架构·springboot
qq_433618441 小时前
shell 编程(二)
开发语言·bash·shell