基本上我有一个堆分配struct
Box<State>
。我有多个Value
struct
需要对此堆分配的struct
具有不可变引用。
我可以在Value
内使用哪种属性作为参考?使用Rc<Box<State>>
无效,因为我需要Value
来实施Copy
而State
不会实现Copy
。当需要复制自己时,我只想将指针复制到堆分配的State
。
答案 0 :(得分:3)
你所要求的基本上是不可能的。如果你有许多指向浮动的堆分配指针,你需要以某种方式跟踪这些指针,以便在所有这些指针被销毁后能够解除分配。但是,这需要在指针被复制时执行某事,和/或在指针被销毁时执行某事。
嗯,这不是真的,有两种解决方法:
但是第一种在大多数情况下都是不切实际的(即使你负担得起也很脏),而第二种则有其他成本和影响深远的结果,而且目前Rust还没有得到很好的支持。
唯一明智的做法是放弃Copy
要求。也许你让Copy
与Clone
混淆了?这两者之间的主要区别在于,您必须在clone()
隐式工作时明确调用Copy
。 Rc<anything>
是Clone
并且克隆引用计数指针只会增加引用计数,而不是克隆指针后面的东西。 (在这种情况下,你几乎可以而且应该摆脱Box
,因为Rc<T>
已经在堆上分配T
,所以Box
只是一个没有意义的额外的间接。)