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