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);
}
相关推荐
亦是远方16 小时前
南京邮电大学使用计算机求解问题实验一(C语言简单编程练习)
c语言·开发语言·实验报告·南京邮电大学
我是哈哈hh17 小时前
【Python数据分析】Numpy总结
开发语言·python·数据挖掘·数据分析·numpy·python数据分析
Michelle802317 小时前
24大数据 14-2 函数练习
开发语言·python
qq_3814549917 小时前
Python学习技巧
开发语言·python·学习
用户214118326360217 小时前
手把手教你用Claude制作专属PPT生成器-从模板学习到自动生成全流程实战
后端
勇气要爆发17 小时前
物种起源—JavaScript原型链详解
开发语言·javascript·原型模式
freedom_1024_18 小时前
【c++】使用友元函数重载运算符
开发语言·c++
San30.18 小时前
深入理解 JavaScript OOP:从一个「就地编辑组件」看清封装、状态与原型链
开发语言·前端·javascript·ecmascript
郑州光合科技余经理18 小时前
基于PHP:海外版同城O2O系统多语言源码解决方案
java·开发语言·git·spring cloud·uni-app·php·uniapp
zmzb010318 小时前
C++课后习题训练记录Day43
开发语言·c++