答案解析:
答案:错误
引用(&T)是安全的,由借用检查器保证内存安全。
原始指针(*const T, *mut T)是不安全的,解引用时需要使用unsafe块。
原始指针可能指向无效内存,不受借用检查器约束。
答案解析:
答案:Box<T>
Box<T>是Rust中最基本的智能指针,用于在堆上分配内存。
&T是引用,*const T和*mut T是原始指针,都不是智能指针。
其他智能指针还包括Rc<T>、Arc<T>、RefCell<T>等。
答案解析:
答案:Rc<T>是单线程的,Arc<T>是多线程安全的
Rc<T>(Reference Counted)只能在单线程中使用,引用计数操作不是原子的。
Arc<T>(Atomically Reference Counted)使用原子操作,可以在多线程间安全共享。
两者都用于共享所有权,但Arc<T>有额外的线程安全开销。
答案解析:
答案:正确
RefCell<T>提供内部可变性,将借用检查从编译时推迟到运行时。
如果违反借用规则(如同时存在多个可变借用),程序会在运行时panic。
这允许在某些编译器无法验证安全性的情况下实现可变性。
答案解析:
答案:内存地址
{:p}格式化符用于打印指针的内存地址。
&x as *const i32将引用转换为原始指针。
输出类似于"0x7fff5fbff6ac"的十六进制地址。
答案解析:
答案:正确
Weak<T>是Arc<T>的弱引用,不会阻止值被释放。
当所有强引用(Arc)被释放后,即使还有弱引用存在,值也会被释放。
这是解决循环引用问题的重要工具,避免内存泄漏。
答案解析:
答案:以上所有
解引用原始指针时,程序员必须保证:
1. 指针不为空且指向有效的、已分配的内存
2. 指针指向的类型与声明的类型匹配
3. 内存对齐符合类型要求
4. 在指针生命周期内,内存不会被释放或重新分配
答案解析:
答案:指向已被释放内存的指针
悬垂指针是指向已经被释放或无效内存位置的指针。
在Rust中,借用检查器防止创建悬垂引用,但原始指针仍可能悬垂。
使用悬垂指针会导致未定义行为,可能造成程序崩溃或数据损坏。
答案解析:
答案:数据太大不适合放在栈上时
Box<T>主要用于:
1. 将大型数据移到堆上,避免栈溢出
2. 创建递归数据结构(如链表、树)
3. 当编译时不知道类型大小时
多个所有者用Rc<T>,线程共享用Arc<T>,内部可变性用RefCell<T>。
答案解析:
答案:Cell<T>只适用于Copy类型,RefCell<T>可以借用任何类型
Cell<T>:
- 只能用于实现Copy trait的类型
- 通过get()和set()方法操作,总是移动或复制值
- 零运行时开销,无借用检查
RefCell<T>:
- 可用于任何类型
- 通过borrow()和borrow_mut()方法借用
- 有运行时借用检查开销