- 主题:讨论一下所有权的概念,所有权=析构责 吗?
ownership 其实是一个比喻性的概念,对不熟悉这个名词源流的初学者来说,往往一头雾水。所以想讨论一下,这个东西的核心本质是不是其实就是说 duty of dropping?
我自己目前的结论是,“所有权”主要就是等价于“析构责”,一个变量 own 一个堆资源,其实就是说这个变量需要在他自己出栈销毁的时候负责顺便把那个堆空间也销毁掉(通过 Drop::drop);
其次,所有权还影响可变性。如果一个容器性质的变量 C own 很多成员堆资源,那么如果这个容器 C 是一个 mutable place expr, 那么其内部成员,比如 C[index], C.field, *C (C impl DerefMut<T> 但 C 不是 &mut T)也应该是 mutable place expr。当然这一条并不那么重要。
--
FROM 123.120.189.*
具有drop duty的肯定是唯一的呀,防止 double free 呀,唯一性可以说已经包含在 drop duty 里面了
【 在 RunningOn 的大作中提到: 】
: duty of dropping 是一方面吧。
: 主要还是强调唯一性,类似于unique_ptr的感觉。
--
修改:beep FROM 123.120.189.*
FROM 123.120.189.*
我来稍微解释一下:
所有权这个概念,本身在 rust 的语言设计里面是不存在的,是对一些具体的语言设计所造成结果的描述性的概念。也就是说,完全可以设想一个 rust 教程,根本不引入所有权这个词,照样可以把所有的事情讲清楚。
那么,所有权概念,到底对应着语言中的哪些具体设计呢?
1. 局部变量可以通过 box 操作开辟并指向一段堆空间,也就是经常比喻的风筝线;
2. 风筝线变量必有 Drop,出栈销毁前必定收回风筝(堆资源),不会忘记 drop;
3. 风筝线变量必无 Copy,变量交接时原变量失效,即只有一根风筝线,不会重复 drop;
4. 特殊的 Rc/Arc 风筝线变量可以多根线牵同一个风筝,各线 drop 时根据计数决定由谁最后负责收回风筝,保证不会忘记 drop 也不会重复 drop。
感觉这四条是否就可以把所有权概念指代的所有内涵都覆盖到?如果这个理解成立,那么所有权其实就是代表着 duty of drop,并没有其他任何多出来的涵义。
【 在 RunningOn 的大作中提到: 】
: duty of dropping 是一方面吧。
: 主要还是强调唯一性,类似于unique_ptr的感觉。
--
FROM 123.120.189.*
析构责的内在要求就是不能忘记析构(析构的存在性),也不能重复析构(析构的唯一性)。
当然也有例外嘛,Rc 就是通过计数来保证多个东西共享析构责,但保证之后最后存活的那个才会真正执行析构。这也就是共享了所有权
【 在 RunningOn 的大作中提到: 】
: 唯一性导致有责去析构,但反之并不成立啊。
: 析构责为啥要唯一性来保证呢。
--
FROM 123.120.189.*