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);
}
相关推荐
Rust研习社11 小时前
组合真的优于继承吗?为什么 Rust 和 Go 都拥抱组合舍弃继承?
后端·rust·编程语言
IT_陈寒12 小时前
JavaScript的闭包把我坑惨了,说好的内存会自动回收呢?
前端·人工智能·后端
CaffeinePro13 小时前
Pydantic深度使用:数据校验、枚举、ORM映射
后端·fastapi
Chenyiax13 小时前
从 Chat 到 Responses:OpenAI API 抽象为什么变了?
后端
MariaH13 小时前
Koa和Express的区别
后端
MariaH13 小时前
Koa框架的使用
后端
luckdewei14 小时前
那个用 passlib 做认证的新同事,上线第一天就把用户密码写进了日志
后端
ping某16 小时前
为什么 Nginx 明明监听了 80,转发后端时却用了 4xxxx 端口?
后端·nginx
JustHappy16 小时前
我汇总了身边朋友的经历才发现,其实第一份实习是最难找的......
前端·后端·面试
uhakadotcom16 小时前
在python 的 工程化架构中 ,什么是 薄包装器层?
后端·面试·github