Ownership

- 1 min
  1. Rust 中的所有权是如何管理内存的?提到了哪三种流派?
  2. 为什么在 Rust 中需要区分栈和堆?它们之间有什么区别?
  3. 什么是悬空指针(Dangling Pointer)?为什么它是一个内存安全问题?
  4. Rust 中的所有权规则是什么?请列举并解释每条规则。
  5. 在 Rust 中,什么是深拷贝和浅拷贝?举例说明它们之间的区别。

2. 为什么在 Rust 中需要区分栈和堆?它们之间有什么区别?

stack

固定size, 用来存放数字,布尔

heap

不固定size, 用来存放string, struct

  1. 每次往里面放东西的时候, 都需要申请内存空间
  2. 申请到空间之后, 会把这个内存空间标记为已经使用, 并且返回一个指针表示内存地址

3. 什么是悬空指针(Dangling Pointer)?为什么它是一个内存安全问题?

悬空指针: 类似objective-c里面的野指针, 是指指向已经释放的内存地址的指针。

  1. 可能导致内存泄露,程序崩溃,数据损坏. 因为可能有两种情况(a. OS已经把这个内存空间分配给别的程序. b.该内存空间没有定义.)
  2. 难以调试,只有运行到那个位置的时候才会报错

4. Rust 中的所有权规则是什么?请列举并解释每条规则。

  1. 变量和值是一对一的关系
  2. 离开作用域, 值会被drop(自动释放)

5. 在 Rust 中,什么是深拷贝和浅拷贝?举例说明它们之间的区别。

深拷贝(内存对象)

复制的时候会复制(内容和指针/引用)

深拷贝通常会涉及到heap上的数据

消耗更多的时间和内存

// deep copy
let s1 = String::from("hello")
let s2 = s1.clone()

浅拷贝(数值/布尔)

只复制(指针/引用)

多个变量会指向同一片内存

// shallow copy
let x = 5
let y = x