我应该将哪个容器用于堆分配结构的多个不可变引用?

时间:2016-02-20 11:37:22

标签: rust heap

基本上我有一个堆分配struct Box<State>。我有多个Value struct需要对此堆分配的struct具有不可变引用。

我可以在Value内使用哪种属性作为参考?使用Rc<Box<State>>无效,因为我需要Value来实施CopyState不会实现Copy。当需要复制自己时,我只想将指针复制到堆分配的State

1 个答案:

答案 0 :(得分:3)

你所要求的基本上是不可能的。如果你有许多指向浮动的堆分配指针,你需要以某种方式跟踪这些指针,以便在所有这些指针被销毁后能够解除分配。但是,这需要在指针被复制时执行某事,和/或在指针被销毁时执行某事

嗯,这不是真的,有两种解决方法:

  • 不要解除分配,即泄漏内存
  • 让垃圾收集器定期浏览可能包含分配指针的所有内存。

但是第一种在大多数情况下都是不切实际的(即使你负担得起也很脏),而第二种则有其他成本和影响深远的结果,而且目前Rust还没有得到很好的支持。

唯一明智的做法是放弃Copy要求。也许你让CopyClone混淆了?这两者之间的主要区别在于,您必须在clone()隐式工作时明确调用CopyRc<anything>Clone并且克隆引用计数指针只会增加引用计数,而不是克隆指针后面的东西。 (在这种情况下,你几乎可以而且应该摆脱Box,因为Rc<T>已经在堆上分配T,所以Box只是一个没有意义的额外的间接。)