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);
}