rust语言基础学习:智能指针RefCell<T>与内部可变性模式
📅 2020-07-15
昨天学习了智能指针Rc<T>
,Rc<T>
的使用场景是需要一个值有多个所有者的时候,这个场景出现在程序的运行时,Rc<T>
是带有引用计数的智能指针,可以绕开编译器对所有权的静态检查。
Rc<T>
内部使用了Box::leak
将分配的堆内存泄露以绕开编译器对所有权规则的检查,泄露出来的堆内存不再受栈内存的自动管理,而是在运行时通过对引用计数的动态检查确保在合适的时机释放堆内存。
昨天学习了智能指针Rc<T>
,Rc<T>
的使用场景是需要一个值有多个所有者的时候,这个场景出现在程序的运行时,Rc<T>
是带有引用计数的智能指针,可以绕开编译器对所有权的静态检查。
Rc<T>
内部使用了Box::leak
将分配的堆内存泄露以绕开编译器对所有权规则的检查,泄露出来的堆内存不再受栈内存的自动管理,而是在运行时通过对引用计数的动态检查确保在合适的时机释放堆内存。
昨天学习了Rust中的智能指针Box<T>
,使用Box可以强制将数据分配在堆上,然后栈上放一个指针指向并拥有这个数据,堆内存中数据的生命周期与栈上指针的生命周期一致。
智能指针Box<T>
有三个使用场景:当有大量的数据,并且希望在确保数据不被拷贝的情况下转移所有权的时候;当有一个在编译时未知大小的类型,而又想要在需要确切大小的上下文中使用这个类型值的时候;当希望拥有一个值并只关心它的类型是否实现了特定 trait 而不是其具体类型的时候。
昨天学习了Rust中智能指针的概念,智能指针是Rust中一种数据结构,它的表现类似指针,同时有额外的元数据和功能。
大多数智能指针拥有其所指向数据的所有权,智能指针被分配到栈上,指向堆上的数据,实现了堆内存受栈内存生命周期控制,这样Rust通过所有权机制为堆上的值也引入了生命周期。
今天,我们将学习Rust标准库中的智能指针Box<T>
。
学习Rust基础最重要的就是理解它的内存管理,前面我们学习了Rust赋值相关的Copy语义, Move语义, Borrow语义(引用和借用), 学习了Rust生命周期等知识。 这些概念都要围绕Rust如何管理内存来理解。本节开始将学习Rust中的智能指针。
...前面学习了Rust的所有权规则、Move和Copy语义、引用和借用的知识,是时候学习Rust中关于引用有效性和生命周期的知识了。 在Rust中使用借用时必须遵循以下借用规则:
借用规则的第一条引用不能超过值的生命周期,就是本节我们要学习的生命周期,Rust的编译器通过对比值和其引用的生命周期,来确保满足这条规则。
...前面学习了Rust的所有权规则、Move和Copy语义、引用和借用的知识。 今天先做一个复习,再从几个代码例子继续加深对Rust所有权的理解。
Rust的所有权主要是用来管理堆内存的,所有权就是堆上数据的拥有和释放权,在Rust中这个权利是独占的,即单一所有权。
...昨天学习了rust中的Move语义和Copy语义。先做一个简单的复习:
Move语义下的单一所有权虽然解决了其他编程语言中堆内存上数据被随意引用的问题,但也会带来使用上的不便,因为失去所有权的变量将会失效无法被继续使用,例如下面的示例代码:
...昨天学习了Rust的所有权规则,Rust的所有权和生命周期是Rust同其他编程语言的主要区别所在。Rust的所有权规则有以下3条:
在Rust中一个值在同一时刻只能有一个所有者,因为如果允许共享所有权,就会带来使用和释放上的问题,就只能选择其他编程语言管理内存的方式。 那么什么情况下会发生所有权不唯一的问题呢?有以下三种情况:
...所有权和生命周期是Rust同其他编程语言的主要区别。本文将先学习Rust的所有权,所有权是Rust的核心功能之一。
不同编程语言开发的程序在运行时采用不同的方式管理内存,一些语言(如Go, Java, Python)具有垃圾回收机制;还有一些语言(C/C++)必须由程序员自己分配和释放内存;Rust则采用了独特的方式:通过所有权系统管理内存,编译器在编译时会根据所有权规则对内存的使用进行检查。在运行时,所有权系统的任何功能都不会减慢程序。
...今天来学习rust中的std::str::FromStr
这个trait。
FromStr
是rust标准库中定义的trait,当一个类型实现FromStr
trait后,调用字符串的泛型函数str.parse()
就可以很方便的实现字符串到某个具体类型的转换。
注意FromStr
没有生命周期参数,因此只能解析本身不包含生命周期的类型。例如,可以解析实现FromStr的i32
,但不能解析&i32
,可以解析包含i32
的struct,但不能解析包含&i32
的struct。