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);
}
相关推荐
离陌在学C#2 小时前
C# 事件(Event)详解:从概念到实战
开发语言·c#
To_OC2 小时前
Next.js + Redis 构建笔记系统:Redis Hash 实战与性能优化
redis·后端·next.js
Terra.K2 小时前
Java异常学习[特殊字符]
java·开发语言·学习
葡萄城技术团队4 小时前
InfluxDB 2\.x 深度解析:核心架构、Flux 函数与制造业落地指南(三)
java·开发语言·架构
counting money4 小时前
Java IO流详解:从InputStream到文件操作实战
java·开发语言·python
wuyk5554 小时前
98.C语言易混难点:字符数组与字符串指针的底层差异
c语言·开发语言·c++·stm32·嵌入式硬件·算法
峥无5 小时前
从0到1手撕红黑树:封装实现 my_map 与 my_set(SGI-STL 源码级深度解析)
开发语言·c++·笔记·算法·stl
波特率1152005 小时前
C++新特性---属性说明符与标准属性
开发语言·c++
程序员小八7775 小时前
上海百度B端java后端日常实习一面
java·开发语言
北斗落凡尘5 小时前
LangGraph 入门实战(11)--输出模式
后端·python·langchain