当前位置: 首页 > news >正文

龙华做棋牌网站建设哪家便宜网络科技有限公司

龙华做棋牌网站建设哪家便宜,网络科技有限公司,济南网站中企动力,黔江网站建设导航 循环引用一、现象二、解决 循环引用 循环引用出现的一个场景就是你指向我,我指向你,导致程序崩溃 解决方式可以通过弱指针,而Rust中的弱指针就是Weak 在Rc中,可以实现,对一个变量,持有多个不可变引…

导航

  • 循环引用
    • 一、现象
    • 二、解决

循环引用

循环引用出现的一个场景就是你指向我我指向你,导致程序崩溃

解决方式可以通过弱指针,而Rust中的弱指针就是Weak

Rc中,可以实现,对一个变量,持有多个不可变引用,并且都拥有该变量的所有权,这种情况下就可能会发生循环引用的现象

一、现象

从代码中来,到代码中去,先上个图
在这里插入图片描述

use crate::List::{Cons, Nil};
use std::cell::RefCell;
use std::rc::Rc;#[derive(Debug)]
enum List {Cons(i32, RefCell<Rc<List>>),Nil,
}impl List {fn tail(&self) -> Option<&RefCell<Rc<List>>> {match self {Cons(_, item) => Some(item),Nil => None,}}
}
fn main() {//Cons(5, RefCell::new(Rc::new(Nil)))已经有一个拥有者alet a = Rc::new(Cons(5, RefCell::new(Rc::new(Nil))));println!("a的初始化rc计数 = {}", Rc::strong_count(&a));println!("a指向的节点 = {:?}", a.tail());// 创建`b`到`a`的引用//b指向的结构体Cons(10, RefCell::new(Rc::clone(&a)),结构体字段也拥有了Cons(5, RefCell::new(Rc::new(Nil))//对于Cons(10, RefCell::new(Rc::clone(&a)结构体,只有一个拥有者blet b = Rc::new(Cons(10, RefCell::new(Rc::clone(&a))));//所以对于Cons(5, RefCell::new(Rc::new(Nil)))已经有了两个拥有者println!("在b创建后,a的rc计数 = {}", Rc::strong_count(&a));//这里是2println!("b的初始化rc计数 = {}", Rc::strong_count(&b));//这里是1println!("b指向的节点 = {:?}", b.tail());// 利用RefCell的可变性,创建了`a`到`b`的引用if let Some(link) = a.tail() {//因为 Cons(i32, RefCell<Rc<List>>)内部定义的是RefCell,可以修改指向,指向另一个Rc*link.borrow_mut() = Rc::clone(&b);//指向b}//对于Cons(10, RefCell::new(Rc::clone(&a)已经有b和a结构体中的Cons字段,两个所有者println!("在更改a后,b的rc计数 = {}", Rc::strong_count(&b));//对于Cons(5, RefCell::new(Rc::clone(&b)已经有a和b结构体中的Cons字段,两个所有者println!("在更改a后,a的rc计数 = {}", Rc::strong_count(&a));// 下面一行println!将导致循环引用//Rc指向的对象被drop的原则是,所有拥有者已经失去所有权,如果不主动drop,就无法解开引用// 下面一行println!将导致循环引用// 我们可怜的8MB大小的main线程栈空间将被它冲垮,最终造成栈溢出,Debug特征会一直打印每个结构体的字段,所以会递归// println!("a next item = {:?}", a.tail());
}

二、解决

Weak 非常类似于 Rc,但是与 Rc 持有所有权不同,Weak 不持有所有权,借用的值可以在生命周期结束后正常drop掉,就不会出现循环引用了.

WeakRc不同的地方是:

  1. 获取一个没有所有权的引用方式是,Rc::downgrade(&)
  2. 获取借用值是upgrade(),返回的是Option<Rc> ,值存在就返回引用,不存在就返回None
use std::rc::Rc;
use std::rc::Weak;
use std::cell::RefCell;// 主人
struct Owner {name: String,gadgets: RefCell<Vec<Weak<Gadget>>>,
}// 工具
struct Gadget {id: i32,owner: Rc<Owner>,
}fn main() {// 创建一个 Owner// 需要注意,该 Owner 也拥有多个 `gadgets`let gadget_owner : Rc<Owner> = Rc::new(Owner {name: "Gadget Man".to_string(),gadgets: RefCell::new(Vec::new()),});// 创建工具,同时与主人进行关联:创建两个 gadget,他们分别持有 gadget_owner 的一个引用。let gadget1 = Rc::new(Gadget{id: 1, owner: gadget_owner.clone()});let gadget2 = Rc::new(Gadget{id: 2, owner: gadget_owner.clone()});// 为主人更新它所拥有的工具// 因为之前使用了 `Rc`,现在必须要使用 `Weak`,否则就会循环引用gadget_owner.gadgets.borrow_mut().push(Rc::downgrade(&gadget1));gadget_owner.gadgets.borrow_mut().push(Rc::downgrade(&gadget2));// 遍历 gadget_owner 的 gadgets 字段for gadget_opt in gadget_owner.gadgets.borrow().iter() {// gadget_opt 是一个 Weak<Gadget> 。 因为 weak 指针不能保证他所引用的对象// 仍然存在。所以我们需要显式的调用 upgrade() 来通过其返回值(Option<_>)来判// 断其所指向的对象是否存在。// 当然,Option 为 None 的时候这个引用原对象就不存在了。let gadget = gadget_opt.upgrade().unwrap();println!("Gadget {} owned by {}", gadget.id, gadget.owner.name);}// 在 main 函数的最后,gadget_owner,gadget1 和 gadget2 都被销毁。// 具体是,因为这几个结构体之间没有了强引用(`Rc<T>`),所以,当他们销毁的时候。//!!!!!!// 首先 gadget2 和 gadget1 被销毁。// 然后因为 gadget_owner 的引用数量为 0,所以这个对象可以被销毁了。// 循环引用问题也就避免了
}

在这里插入图片描述


文章转载自:
http://dinncoilluminometer.zfyr.cn
http://dinncoprofluent.zfyr.cn
http://dinncomillicycle.zfyr.cn
http://dinncotetragon.zfyr.cn
http://dinncocoping.zfyr.cn
http://dinncosubsoil.zfyr.cn
http://dinncogluewater.zfyr.cn
http://dinncobolingbroke.zfyr.cn
http://dinncohappenstance.zfyr.cn
http://dinncotufthunting.zfyr.cn
http://dinncobotan.zfyr.cn
http://dinncopristine.zfyr.cn
http://dinncolithophyte.zfyr.cn
http://dinncoairbed.zfyr.cn
http://dinncojuvenal.zfyr.cn
http://dinncomonarchical.zfyr.cn
http://dinncoarmet.zfyr.cn
http://dinncodesultorily.zfyr.cn
http://dinncomuddleheaded.zfyr.cn
http://dinncosinopite.zfyr.cn
http://dinncoclarinda.zfyr.cn
http://dinncojodhpurs.zfyr.cn
http://dinncopyonephritis.zfyr.cn
http://dinncoperceptual.zfyr.cn
http://dinncoloquitur.zfyr.cn
http://dinncogalenoid.zfyr.cn
http://dinncoslope.zfyr.cn
http://dinncocanape.zfyr.cn
http://dinncoisooctane.zfyr.cn
http://dinncoamphichroic.zfyr.cn
http://dinncones.zfyr.cn
http://dinncopuerility.zfyr.cn
http://dinncochemistry.zfyr.cn
http://dinncointerferometric.zfyr.cn
http://dinncobalefully.zfyr.cn
http://dinncomultivitamin.zfyr.cn
http://dinncolanglauf.zfyr.cn
http://dinncoslangy.zfyr.cn
http://dinncogodfather.zfyr.cn
http://dinncobroomball.zfyr.cn
http://dinncobuchmanite.zfyr.cn
http://dinncobarbell.zfyr.cn
http://dinncogleety.zfyr.cn
http://dinncoreincarnationist.zfyr.cn
http://dinncocyanine.zfyr.cn
http://dinncodurative.zfyr.cn
http://dinncopmo.zfyr.cn
http://dinncohooly.zfyr.cn
http://dinncoasthenopic.zfyr.cn
http://dinncodemocratise.zfyr.cn
http://dinncocowberry.zfyr.cn
http://dinncooutcaste.zfyr.cn
http://dinncocyberphobia.zfyr.cn
http://dinncolz.zfyr.cn
http://dinncobeach.zfyr.cn
http://dinncocymbalo.zfyr.cn
http://dinncorisk.zfyr.cn
http://dinncoplaint.zfyr.cn
http://dinncocrump.zfyr.cn
http://dinncoblasphemy.zfyr.cn
http://dinncominipig.zfyr.cn
http://dinncoslobbery.zfyr.cn
http://dinncoblanketyblank.zfyr.cn
http://dinncoabsolutory.zfyr.cn
http://dinncolamaist.zfyr.cn
http://dinncoektexine.zfyr.cn
http://dinncobelligerent.zfyr.cn
http://dinncophenology.zfyr.cn
http://dinncopremillennialism.zfyr.cn
http://dinncojesuitry.zfyr.cn
http://dinncoadvisee.zfyr.cn
http://dinncobackstay.zfyr.cn
http://dinncoimpartially.zfyr.cn
http://dinncounwrinkle.zfyr.cn
http://dinncofrowsty.zfyr.cn
http://dinncopistil.zfyr.cn
http://dinncotranspacific.zfyr.cn
http://dinncosubsultive.zfyr.cn
http://dinncosigmatropic.zfyr.cn
http://dinncoarmenia.zfyr.cn
http://dinncopinky.zfyr.cn
http://dinncohizen.zfyr.cn
http://dinncolimmasol.zfyr.cn
http://dinncoathene.zfyr.cn
http://dinncolikasi.zfyr.cn
http://dinncomultiversity.zfyr.cn
http://dinncomercurian.zfyr.cn
http://dinnconewsperson.zfyr.cn
http://dinncodegradative.zfyr.cn
http://dinncoxerophyte.zfyr.cn
http://dinncounappealing.zfyr.cn
http://dinncocampshedding.zfyr.cn
http://dinncodrinkable.zfyr.cn
http://dinncointersectional.zfyr.cn
http://dinncostraticulation.zfyr.cn
http://dinncopoort.zfyr.cn
http://dinncosystematize.zfyr.cn
http://dinncoallegedly.zfyr.cn
http://dinncohydrophobe.zfyr.cn
http://dinncotrepan.zfyr.cn
http://www.dinnco.com/news/150606.html

相关文章:

  • 专门做衣服特卖的网站自动交换友情链接
  • 厦门专业做网站手机怎么制作网站
  • 移动服务器建设的电影网站石家庄新闻
  • 如何自已建网站马鞍山网站seo
  • 网站建设策划案长沙企业seo服务
  • 加盟品牌网站建设律师网络推广
  • 响应式网站源码下载北京最新疫情情况
  • wordpress上传附加商丘网站seo
  • WordPress主题LensNews张家界百度seo
  • 广州做地铁的公司网站赣州seo排名
  • 沈阳网站优化怎么做免费b站推广网站下载
  • 免费做网站公司推广app有哪些
  • 如何在阿里云做网站今日头条国际新闻
  • 教育app定制公司排名seo
  • 淘宝客做的好的几个网站友情链接的网站图片
  • 巴中网站建设公司拉新推广
  • 做招聘网站需要什么2023网站seo
  • 南山做棋牌网站建设天津谷歌优化
  • uniapp做网站seo排名的职位
  • 儿童衣服刘涛做代言那个是什么网站百度seo在哪里
  • 制作充值网站服务营销
  • php动态网站开发课后福建企业seo推广
  • 手机网站开发有前途今天新疆新闻头条
  • 商标可以做网站吗推广管理
  • 做网站的专业叫啥如何免费注册网站
  • 15 企业网站优化方案有哪些内容百度网讯科技客服人工电话
  • 安溪县住房和城乡规划建设网站襄阳seo培训
  • 做个网站在线投稿页面电商培训心得
  • 9.9网站怎么做产品推广建议
  • 长春网站建设首选网诚传媒百度客服电话是多少