Rust所有权

Rust所有权

今天本来随便看看rust的语法,但是看到rust的所有权时觉得挺新颖的,特意做做笔记。

  1. 所有权规则

    • rust中的每个值都有一个变量,称其为所有者
    • 一次只能有一个所有者
    • 当所有者不在程序运行范围时,该值会被删除
  2. 内存分配

    rust同样适用堆来动态分配内存,但相比C/C++,rust不需要程序员手动释放堆内存,因为编译器会在编译阶段自动在程序范围结束时为堆内存中的变量释放内存。

  3. 变量和数据交互的方式

    对于这样一段代码

    let x = 5;
    let y = x;
    

    与许多语言不同的是,rust的这段代码中y并不是直接指向x的值,而是将x的值复制一份后再赋值。这个过程是一直发生在栈内存中。因为涉及到的变量都是基本类型。

    基本类型包括:整型,布尔类型,浮点数,字符类型以及包含以上类型的元组。

    当有其它类型时,这个过程则发生在堆中,比如

    let s1 = String::from("hello");
    let s2 = s1;
    

    s1的值是存储在堆中,而当s2指向s1中,编译器只复制了栈中s1的部分,s2依旧指向s1。由于前面讲到变量的值一次只能有一个所有者,所以这时s1已经不可用了。

    如果只想要将s1复制一份,就可以使用clone方法

    let s1 = String::from("hello");
    let s2 = s1.clone();
    
  4. 涉及函数的所有权机制

    众所周知,很多语言一到涉及函数参数的传递就是一个令人头疼的问题,rust也不例外。

    • 如果将变量作为参数传入函数,那么它和移动的效果是一样的,也就是说如果参数不是基本类型的话,那么它在接下来的程序中将不可使用。
    • 函数返回值的所有权机制,被当做返回值的变量会被移动到调用函数的程序中,而不会直接释放。
  5. 引用和租借

    在rust中,&运算符可以取变量的“引用”,这种引用是将变量指向其所引用的变量,而不是指向其所引用的变量的值,也就不会带来变量引用导致重复释放的问题。

    引用来的数据对于变量来说不具有所有权,也就是只有可读的权力,没有写入的权力,若对引用变量进行修改会被阻止。

    如果想要进行有写入权的引用,则可以通过&mut的方式进行引用,前提是被引用的变量由mut修饰。但是可变引用不允许多重引用,不可变引用可以。

  6. 悬垂引用(Dangling References)

    放在有指针概念的编程语言就是没有指向实际变量或值的指针。

posted @ 2020-04-21 17:54  kaleidopink  阅读(357)  评论(0编辑  收藏  举报