cs110l学习记录
列举了c语言使用的一些常见问题,反复释放,悬空指针,内存泄漏,use-after-free
展示了一些c语言项目的做法
通过注释的形式约定谁负责管理内存,维护pre/postcondition
c语言表达能力/类型系统太弱,不能表达所有者
然后是rust语言能在语言层面提供这种所有权的支持
变量名是主人,等式右侧是内存对象
一个主人持有一个对象的语义是要对该对象的内存管理负责
一个值有且只有一个主人,主人销毁值销毁
rust中的两种trait
copy trait 复制堆上的内容
对于int32这种只在栈上的数据,浅拷贝相当于深拷贝
drop trait 转移持有者
如果有copy trait就不允许使用drop trait
rust中所有变量默认immutable(包括下述的引用类型)
引用类型
变量只能同时有多个不可变引用类型或者一个可变引用类型
因此:
当存在一个可变引用类型时,原变量暂时不可用
当只有不可变引用类型时,原变量暂时不可变
fn main() {
let mut v = vec![1, 2, 3];
/* This for loop borrows the vector above to do its work. */
for i in &mut v {
println!("{}", i);
v.push(34); /* can cause resize -> moving in memory! */
}
}分别在for循环和push处两次可变引用
C语言错误处理的两个问题
太容易miss错误
错误处理代码太verbose,如传播错误
rust使用enum+match保证对错误必须处理,?简化错误传播
CS 245, CS 244B, CS149