Rust--如何实现内存安全的?

一、Rust的内存管理

采用虚拟内存空间在栈和堆上分配内存,这是诸多编程语言通用的内存管理基石,Rust也是一样。然而,与c/c++语言不同的是,Rust不需要开发者显式地通过malloc/new或free/delete之类的函数去分配和回收堆内存。

栈内存的生命周期是短暂的,会随着栈展开(如函数调用)的过程而被自动清理。而堆内容是动态的,其分配和重新分配并不遵循某个固定的模式,所以需要使用指针来对其进行跟踪。

Rust也引入了智能指针来管理内存。智能指针在堆上开辟内存空间,并拥有其所有权,通过存储于栈中的指针来管理堆内存。智能指针的RAII机制利用栈的特点,在栈元素被自动清空时自动调用析构函数,来释放智能指针所管理的堆内存间。

函数的局部变量

在函数中定义的局部变量都会被默认存储到栈中。这和c/c++语言,甚至更多的语言行为都一样,但不同的是,Rust编译器可以检查末初始化的变量,以保证内存安全。

Rust编译器会对代码做基本的静态分支流程分析。

当函数调用完毕时,栈帧会被释放,局部变量会被清空。如果变量指向堆内存,那么Rust会自动清空其指向的已分配堆内存。

Rust中的指针

Rust中的指针大致可以分为三种:引用、原生指针(裸指针)和智能指针。

  • 原生指针可以在unsafe块下任意使用,不受Rust的安全检查规则的限制;
  • 引用则必须受到编译器安全检查规则的限制;
  • 智能指针是对指针的一层封装,提供了一些额外的功能,比如自动释放堆内存。智能指针区别于常规结构体的特性在于,它实现了Deref和Drop这两个trait。 Deref提供了解引用能力,Drop提供了自动析构的能力,正是这两个trait让智能指针拥有了类似指针的行为。比如String和Vec类型就是一种智能指针。

RAII(构造和析构)

RAII使用构造函数来初始化资源,使用析构函数来回收资源。

RAII与GC最大的不同在于,RAII将资源托管给创建堆内存的指针对象本身来管理,并保证资源在其生命周期内始终有效,一旦生命周期终止,资源马上会被回收。

二、Rust的内存安全

三、所有权系统

上一篇:Databend 如何利用 Github 做全球协作开发 & 探讨 Rust 智能指针 II


下一篇:Rust中的变量隐藏