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或者返回字符串所有权

克隆

返回字符串所有权:

 所有权转移

完整示例代码:

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");//会分配一块内存来保存字符串helloprintln!("分配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,RUSTlet 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);
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/805726.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入了解go的通道类型

目录 目录 一:类型介绍 二:通道操作 三:通道的特性 四:通道的注意事项

控制文件损坏处理

二、有rman备份的恢复 2.1 只损坏一个控制文件的情况 本文档的恢复场景都是针对的多控制文件的情况,如果你只有一个那当我没说😄。 查看控制文件 SQL> show parameter control_files;NAME TYPE VALUE ---------------------…

nandgame中的Code generation(代码生成)

题目说明: 代码生成为语言的语法规则定义代码生成,以支持加法和减法。 您可以使用在前面级别中定义的堆栈操作(如ADD和SUB)。代码生成模板通常需要包含规则中其他符号的代码。 这些可以通过方括号中的符号名称插入。例如&#xf…

Linux生态系统:探索Linux的开源世界

Linux生态系统:探索Linux的开源世界 在前面的博客中,我们深入探讨了Linux的各种技能和技巧,从入门到进阶,再到高手级别。这一路走来,相信大家对Linux已经有了全面的认识和掌握。然而,Linux的魅力远不止于此。今天,我们将进一步探索Linux生态系统,了解Linux在开源世界中的重要地…

day03-java类型转换和运算符

3.1 表达式和语句 表达式一共分为三种: (1)变量或常量 运算符构成的计算表达式 (2)new 表达式,结果是一个数组或类的对象。(后面讲) (3)方法调用表达式&…

接口自动化进阶: Pytest之Fixture拓展及conftest.py加载机制!

Pytest是一个功能强大的Python测试框架,它提供了很多有用的功能和扩展机制。其中之一是Fixture,Fixture是pytest中的一个装饰器,可以用来提供测试所需的数据和对象。 本篇文章将从头开始,详细介绍如何使用Fixture进行接口自动化测…

关于moviepy出现must be real number, not NoneType

#降级装饰器版本 decorator4.4.2 不行就再降4.0.2 有的也可以通过省级mv解决更多解答https://stackoverflow.com/questions/68032884/getting-typeerror-must-be-real-number-not-nonetype-whenever-trying-to-run-wr

Linux安装Oracle11g(无图形界面下的静默安装)

Oracle11g安装文档-Linux静默安装 环境准备安装数据库配置监听器创建数据库测试打开防火墙 环境准备 创建组和用户 [rootlocalhost ~]# groupadd oinstall #创建oinstall组 [rootlocalhost ~]# groupadd dba  #创建dba组 [rootlocalhost ~]# useradd -g oinstall -G dba -m…

鸿蒙HarmonyOS开发实例:【分布式关系型数据库】

介绍 本示例使用[ohos.data.relationalStore]接口和[ohos.distributedDeviceManager] 接口展示了在eTS中分布式关系型数据库的使用,在增、删、改、查的基本操作外,还包括分布式数据库的数据同步同能。 效果预览 使用说明: 启动应用后点击“ ”按钮可…

《QT实用小工具·十七》密钥生成工具

1、概述 源码放在文章末尾 该项目主要用于生成密钥,下面是demo演示: 项目部分代码如下: #pragma execution_character_set("utf-8")#include "frmmain.h" #include "ui_frmmain.h" #include "qmessag…

ArrayList中多线程的不安全问题

ArrayList中的不安全问题 正常的输出 List<String> list Arrays.asList("1","2","3"); list.forEach(System.out::println);为什么可以这样输出&#xff0c;是一种函数是接口&#xff0c;我们先过个耳熟 Arrys.asList是返回一个ArrayL…

【leetcode面试经典150题】40. 同构字符串(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…

进程间通信 (匿名管道)

一、进程间通信的概念 进程间通信是一个进程把自己的数据交给另一个进程&#xff0c;它可以帮助我们进行数据传输、资源共享、通知事件和进程控制。 进程间通信的本质是让不同的进程看到同一份资源。因此&#xff0c;我们要有&#xff1a; 1、交换数据的空间。2、这个空间不能由…

端口号占用解决方法

进入cmd输入&#xff1a; 第一步输入&#xff1a;netstat -ano|findstr 8080 第二步输入&#xff1a;taskkill -pid **** -f (示例)&#xff1a; C:\Users\Administrator>netstat -ano|findstr 8080 TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING …

AcWing 790. 数的三次方根——算法基础课题解

AcWing 790. 数的三次方根 题目描述 给定一个浮点数 n&#xff0c;求它的三次方根。 输入格式 共一行&#xff0c;包含一个浮点数 n。 输出格式 共一行&#xff0c;包含一个浮点数&#xff0c;表示问题的解。 注意&#xff0c;结果保留 6 位小数。 数据范围 −10000≤…

Linux链接文件管理——硬链接、符号链接

Linux链接文件管理——硬链接、符号链接 硬链接 硬链接是对文件的另一个名字&#xff0c;对于硬链接的文件来说&#xff0c;他们拥有同样的inode号(索引节点号)&#xff0c;表示它们是同一个文件。 创建硬链接不会消耗新的inode和block。 删除硬链接文件&#xff0c;不会影响…

hadoop103: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).

分析&#xff1a; 在启动hadoop服务的时候&#xff0c;遇到了这个问题&#xff1a; hadoop103: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password). 这个一看就是&#xff0c;密钥问题 于是ssh 主机名就行测试 需要输入密码&#xff0c;就说明这里有问…

【C++】每日一题 28 找出字符串中第一个匹配项的下标

给你两个字符串 haystack 和 needle &#xff0c;请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标&#xff08;下标从 0 开始&#xff09;。如果 needle 不是 haystack 的一部分&#xff0c;则返回 -1 。 #include <iostream> #include <string>…

C++笔记(函数重载)

目录 引入&#xff1a; 定义&#xff1a; 易错案例&#xff1a; 引入&#xff1a; 对于实现相似功能的函数&#xff0c;在命名时&#xff0c;我们常会出现命名重复的问题。对于C语言&#xff0c;编译器遇到这种命名重复的情况&#xff0c;会进行报错。而我们的C为了更方便程…

【计算机毕业设计】校园网书店系统——后附源码

&#x1f389;**欢迎来到我的技术世界&#xff01;**&#x1f389; &#x1f4d8; 博主小档案&#xff1a; 一名来自世界500强的资深程序媛&#xff0c;毕业于国内知名985高校。 &#x1f527; 技术专长&#xff1a; 在深度学习任务中展现出卓越的能力&#xff0c;包括但不限于…