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

设计网站哪个好用网站开发项目报告

设计网站哪个好用,网站开发项目报告,飘雪影视在线观看西瓜,公司部门解散调岗不同意有赔偿吗目录 一、智能指针是什么 二、为什么需要智能指针 三、智能指针的使用和原理 3.1、RALL 3.2 智能指针的原理 3.3、智能指针的分类 3.3.1、auto_ptr 3.3.2、unique_ptr 3.3.3、shared_ptr 3.2.4、weak_ptr 一、智能指针是什么 在c中#xff0c;动态内存的管理式通过一…目录 一、智能指针是什么 二、为什么需要智能指针 三、智能指针的使用和原理 3.1、RALL 3.2 智能指针的原理 3.3、智能指针的分类 3.3.1、auto_ptr 3.3.2、unique_ptr 3.3.3、shared_ptr 3.2.4、weak_ptr 一、智能指针是什么 在c中动态内存的管理式通过一对运算符来完成的new,在动态内存中为对象分配空间并返回一个指向该对象的指针我们可以选择对对象进行初始化delete接受一个动态对象的指针销毁该对象并释放与之关联的内存。动态内存的使用很容易出现问题因为确保在正确的时间释放内存是极其困难的。有时使用完对象后忘记释放内存造成内存泄漏的问题。 所谓的智能指针本质就是一个类模板它可以创建任意的类型的指针对象当智能指针对象使用完后对象就会自动调用析构函数去释放该指针所指向的空间。 下面是智能指针的基本框架所有的智能指针类模板中都需要包含一个指针对象构造函数和析构函数。 二、为什么需要智能指针 异常的重新抛出的场景 void File() {string filename;cin filename;FILE* fout fopen(filename.c_str(), r);if (fout nullptr) {string errmsg 打开文件失败;errmsg filename;errmsg -;errmsg strerror(errno);Exception e(errno, errmsg);throw e;}char ch;while ((ch fgetc(fout))!EOF) {cout ch;}fclose(fout); }double Division(int a, int b) {if (b 0) {string errmsg Division by zero condition!;Exception e(100, errmsg);throw e;}else{return ((double)a / (double)b);} }void Func() {int* p new int[100];int len, time;cin len time;try {cout Division(len,time) endl;File();}catch (...){//捕获之后不是要处理异常异常由最外层同一处理//这里捕获异常只是为了处理内存泄漏的问题delete[]p;throw; }delete[]p; }int main() {try {Func();}catch (const Exception e) {cout e.what() endl;}catch (...){cout 未知异常 endl;}return 0; }在Func函数中我们在堆上创建了开一个指针为了防止函数抛出异常导致最后的析构函数不执行而产生野指针我们使用了 异常的重新抛出策略。 但是终究不是个好的方法如果这类资源较多那么我们需要大量的 异常重抛 而且就算程序不涉及程序处理大量的堆上空间需要人工释放容易造成疏漏这一问题在工程中比较常见。 所以这时候如果我们实用智能指针就可以不用再操心内存是否会泄露的问题。 三、智能指针的使用和原理 3.1、RALL RAIIResource Acquisition Is Initialization是一种利用对象生命周期来控制程序资源如内 存、文件句柄、网络连接、互斥量等等的简单技术。 在对象构造时获取资源接着控制对资源的访问使之在对象的生命周期内始终保持有效最后在对象析构的时候释放资源。借此我们实际上把管理一份资源的责任托管给了一个对象。这种做法有两大好处 不需要显式的释放资源采用这种方式对象所需的资源在其生命周期内始终保持有效. 我们可以借助RALL思想来写一个简单的 智能指针 #includeiostream using namespace std;templateclass T class SmartPtr { public:SmartPtr(T* ptr nullptr):_ptr(ptr){}~SmartPtr(){if (_ptr)delete _ptr;cout~SmartPtrendl;} private:T* _ptr; };int main() {int* a new int(1);SmartPtrint sp(a); //将a 指针委托给sp对象管理SmartPtrintsp2(new int(2)); //直接船舰匿名对象给sp2管理 }3.2 智能指针的原理 上述的SmartPtr还不能将其称为智能指针因为它还不具有指针的行为。指针可以解引用也可 以通过-去访问所指空间中的内容因此AutoPtr模板类中还得需要将* 、-重载下才可让其 像指针一样去使用。 templateclass T class SmartPtr { public:SmartPtr(T* ptr nullptr): _ptr(ptr){}~SmartPtr(){if(_ptr)delete _ptr;}T operator*() {return *_ptr;}T* operator-() {return _ptr;} private:T* _ptr; };struct Date {int _year;int _month;int _day; };int main() {SmartPtrint sp1(new int);*sp1 10;cout*sp1endl;SmartPtrint sparray(new Date);// 需要注意的是这里应该是sparray.operator-()-_year 2018;// 本来应该是sparray--_year这里语法上为了可读性省略了一个-sparray-_year 2018;sparray-_month 1;sparray-_day 1; } 总结一下智能指针的原理 1. RAII特性 2. 重载operator*和opertaor-具有像指针一样的行为。 3.3、智能指针的分类         上面的SmartPtr 还不可以被称为智能指针因为它还不具有指针的行为与性质。         指针可以解引用也可以通过-去访问所指向的空间中的内容因此智能指针还需要将 *,-重载。         除此之外如果我们使用了 拷贝或者赋值操作就会发生浅拷贝的问题由于二者指向同一块空间所以在析构的时候也会析构两次造成错误。 所以为了解决以上问题C提供了几种设计方案实现的智能指针。 C中存在4种智能指针auto_ptr,unquie_ptr,shared_ptr,weak_ptr他们各有优缺点以及对应的实用场景 3.3.1、auto_ptr 在C98版本的库种提供了 auto_ptr 的智能指针 class Date { public:Date():_year(0),_month(0),_day(0){}~Date(){}int _year;int _month;int _day;};int main() {auto_ptrDateap(new Date);//拷贝构造auto_ptrDatecopy(ap);ap-_year 2022; }我们发现报错了发生了非法访问。 这就是auto_ptr 的弊病当我们使用对象拷贝或者赋值之后之前的那个对象就被置空如下图         在拷贝或者赋值的过程种auto_ptr 会传递所有权将资源全部从源指针转移给目标指针源指针被置空。         虽然这种方法确实解决了 浅拷贝的问题但是十分局限性也很大这也就导致了我们使用auto_ptr的时候要注意不要对源指针进行访问或者操作。         由于C98种提供的这个智能指针问题明显所以在实际工作种哼多公司是明确规定了不能使用auto_ptr的。 auto_ptr具体实现 templateclass Tclass auto_ptr{public:auto_ptr(T* ptrnullptr):_ptr(ptr){}auto_ptr(auto_ptrT ap):_ptr(ap._ptr){ap._ptr nullptr; //管理权转移}auto_ptrT operator (auto_ptrT ap){if (this ! *ap) {delete _ptr;_ptr ap._ptr;ap._ptr nullptr;}return *this;}~SmartPtr(){if (_ptr)delete _ptr;}T operator *(){return *_ptr;}T* operator -(){return _ptr;}private:T* _ptr;};3.3.2、unique_ptr 在C11中C11y引入了unique_ptr. unique_ptr的原理很简单就是一个“得不到就毁掉”的理念直接把拷贝和赋值禁止了。 对于用不上赋值拷贝的场景的时候我们选择unique_ptr也是一个不错的选择。 templateclass Tclass unique_ptr{public:unique_ptr(T* ptr nullptr):_ptr(ptr){}//防拷贝unique_ptr(unique_ptrT ap) delete;unique_ptrT operator (unique_ptrT ap) delete;~SmartPtr(){if (_ptr)delete _ptr;}T operator *(){return *_ptr;}T* operator -(){return _ptr;}private:T* _ptr;};3.3.3、shared_ptr C中还提供了shared_ptr。 shared_ptr 是当前最为广泛使用的智能指针它可以安全的提供拷贝操作。 shared_ptr的原理         我们可以对一个资源添加一个计数器让所有管理该资源的智能共用这个计数器倘若发生拷贝计数器加一倘若有析构发生 计数器减一当计数器等于0的时候就把对象析构掉。 shared_ptr在其内部给每个资源都维护了着一份计数用来记录该份资源被几个对象共享。在对象被销毁时(就是析构函数调用)就说明自己不使用该资源了对象的引用计数减一。如果引用计数是0就说明自己是最后一个使用该资源的对象必须释放该资源如果不是0就说明除了自己还有其他对象在使用该份资源不能释放该资源否则其他对象就成野指针了。 shared_ptr 的模拟实现 templateclass Tclass shared_ptr{public:shared_ptr(T*ptr nullptr):_ptr(ptr),_pcount(new int(1)){}//拷贝构造shared_ptr(const T sp)_ptr(sp._ptr),_pcount(sp._pcount){(*_pcount);}//赋值拷贝shared_ptrT operator (shared_ptrT sp){if (_ptr ! sp._ptr) {if (--(*_pcount) 0){delete _pcount;delete _ptr;}_ptr sp._ptr;_pcount sp._pcount;(*_pcount);}return *this;}T operator *(){return *_ptr;}T* operator -(){return _ptr;}~shared_ptr(){if (--(*_pcount) 0 _ptr) {delete _pcount;delete _ptr;}}private:T* _ptr;int* _pcount;};我们把 这个 计数器 建在堆上这样就可以保证各个对象之间保持同步同时计数正确。 拷贝构造 赋值拷贝 赋值拷贝需要注意两点 在被赋值之前的对象需要将自己析构也就是放弃当前资源的管理权然后再去被赋值取得新的管理权。避免自己对自己赋值按照1中的机制如果自己对自己赋值会造成无谓的操作或者误析构资源。 另一种写法 shared_ptrT operator(shared_ptrT sp){swap(_ptr, sp._ptr);swap(_pcount, sp._pcount);return *this;}但是此时我们的shared_ptr 还面临着 线程安全的问题。 这里我们需要保障的是对于 计数器的 和 – 造成的线程不安全。对于资源的线程安全问题这不是智能指针保证的部分 templateclass Tclass shared_ptr{public:shared_ptr(T* ptr nullptr):_ptr(ptr), _pcount(new int(1)), _pmtx(new mutex){}void add_ref(){_pmtx-lock();(*_pcount);_pmtx-unlock();}void release_ref(){bool flag false;_pmtx-lock();if (--(*_pcount) 0 _ptr) {delete _pcount;delete _ptr;flag true;cout 释放资源 _ptr endl;}_pmtx-unlock();if (flag)delete _pmtx;}shared_ptr(const shared_ptrT sp):_ptr(sp._ptr),_pcount(sp._pcount),_pmtx(sp._pmtx){add_ref();}shared_ptrT operator (const shared_ptrT sp){if (_ptr ! sp._ptr) {if (--(*_pcount) 0){delete _pcount;delete _ptr;}_ptr sp._ptr;_pcount sp._pcount;add_ref();}return *this;}T operator *(){return *_ptr;}T* operator -(){return _ptr;}T* get(){return _ptr;}int use_count(){return *_pcount;}~shared_ptr(){release_ref();}private:T* _ptr;int* _pcount;mutex* _pmtx;};定制删除器 不管是我们自己实现的shared_ptr还是库中的shared_ptr,我们在析构的时候默认都是 delete _ptr,如果我们托管的类型是 new T[] ,或者 malloc出来的话就导致类型不是匹配的无法析构。 为此shared_ptr提供了 定制删除器我们可以在构造的时候作为参数传入。如果我们不传参就默认使用delete 这个自定义删除器可以是函数指针仿函数lamber,包装器。 仿函数的删除器 shared_ptr中的析构函数会去调用DelArry仿函数去释放动态数组。 3.2.4、weak_ptr 虽然 shared_ptr 确实已经是一个不错的设计了但是没有“十全十美”的东西在一些特别的场景之下shared_ptr 也无能为力 shared_ptr 的循环引用 我们看下面的场景我们运行发现两个节点n1.n2 都没有析构。 在出了作用域之后首先把 n1,n2 两个对象析构此时两边计数器均减为1那么左边节点资源什么时候析构呢, 当n2-prev析构也就是当右边节点资源析构那么右边节点资源什么时候析构呢当n1-_next析构也就是当左边节点资源析构…我们发现此时形成了一个类似于“死锁”的情况。 此时我们就要使用 weak_ptr 来解决 循环引用 weak_ptr是一个弱引用它是为了配合shared_ptr而引入的一种智能指针是为了解决循环引用而生的为什么这么说呢我们可以看看它的构造函数 我们只能使用 wek_ptr或者 shared_ptr 去初始化它。 我们在会产生循环引用的位置把shared_ptr换成weak_ptr。 weak_ptr 不是一个RALL智能指针它不参与资源的管理他是专门用来解决引用计数的我们可以使用一个shared_ptr 来初始化一个weak_ptr,但是weak_ptr 不增加引用计数不参与管理但是也像指针一样访问修改资源。 实现一个weak_ptr templateclass Tclass weak_ptr{public:weak_ptr():_ptr(nullptr){}weak_ptr(shared_ptrT sp):_ptr(sp.get()),_pcount(sp.use_count()){}weak_ptr(weak_ptrT sp):_ptr(sp._ptr), _pcount(sp._pcount){}weak_ptr operator (shared_ptrT sp){_ptr sp.get();_pcount sp.use_count();return *this;}weak_ptr operator (weak_ptrT sp){_ptr sp._ptr;_pcount sp._pcount;return *this;}T operator*(){return *_ptr;}T* operator-(){return _ptr;}int use_count(){return *_pcount;}private:T* _ptr;int* _pcount;};
文章转载自:
http://www.morning.pkmcr.cn.gov.cn.pkmcr.cn
http://www.morning.zsyrk.cn.gov.cn.zsyrk.cn
http://www.morning.fddfn.cn.gov.cn.fddfn.cn
http://www.morning.lmxzw.cn.gov.cn.lmxzw.cn
http://www.morning.tkfnp.cn.gov.cn.tkfnp.cn
http://www.morning.wyrsn.cn.gov.cn.wyrsn.cn
http://www.morning.wphzr.cn.gov.cn.wphzr.cn
http://www.morning.kpygy.cn.gov.cn.kpygy.cn
http://www.morning.zkqwk.cn.gov.cn.zkqwk.cn
http://www.morning.mhlkc.cn.gov.cn.mhlkc.cn
http://www.morning.rwnx.cn.gov.cn.rwnx.cn
http://www.morning.wqcbr.cn.gov.cn.wqcbr.cn
http://www.morning.lhygbh.com.gov.cn.lhygbh.com
http://www.morning.qlpq.cn.gov.cn.qlpq.cn
http://www.morning.rcmcw.cn.gov.cn.rcmcw.cn
http://www.morning.xnymt.cn.gov.cn.xnymt.cn
http://www.morning.fldsb.cn.gov.cn.fldsb.cn
http://www.morning.nkdmd.cn.gov.cn.nkdmd.cn
http://www.morning.zpfqh.cn.gov.cn.zpfqh.cn
http://www.morning.tmlhh.cn.gov.cn.tmlhh.cn
http://www.morning.wsxly.cn.gov.cn.wsxly.cn
http://www.morning.jnhhc.cn.gov.cn.jnhhc.cn
http://www.morning.cctgww.cn.gov.cn.cctgww.cn
http://www.morning.mftdq.cn.gov.cn.mftdq.cn
http://www.morning.mgkcz.cn.gov.cn.mgkcz.cn
http://www.morning.jzfrl.cn.gov.cn.jzfrl.cn
http://www.morning.srtw.cn.gov.cn.srtw.cn
http://www.morning.prsxj.cn.gov.cn.prsxj.cn
http://www.morning.wklyk.cn.gov.cn.wklyk.cn
http://www.morning.dschz.cn.gov.cn.dschz.cn
http://www.morning.jxrpn.cn.gov.cn.jxrpn.cn
http://www.morning.xcjbk.cn.gov.cn.xcjbk.cn
http://www.morning.dsxgc.cn.gov.cn.dsxgc.cn
http://www.morning.hkswt.cn.gov.cn.hkswt.cn
http://www.morning.pzjrm.cn.gov.cn.pzjrm.cn
http://www.morning.jxwhr.cn.gov.cn.jxwhr.cn
http://www.morning.ghssm.cn.gov.cn.ghssm.cn
http://www.morning.lbbgf.cn.gov.cn.lbbgf.cn
http://www.morning.ghjln.cn.gov.cn.ghjln.cn
http://www.morning.lmxrt.cn.gov.cn.lmxrt.cn
http://www.morning.pfntr.cn.gov.cn.pfntr.cn
http://www.morning.rdmz.cn.gov.cn.rdmz.cn
http://www.morning.tcylt.cn.gov.cn.tcylt.cn
http://www.morning.mbhdl.cn.gov.cn.mbhdl.cn
http://www.morning.qbfwb.cn.gov.cn.qbfwb.cn
http://www.morning.zlzpz.cn.gov.cn.zlzpz.cn
http://www.morning.qfths.cn.gov.cn.qfths.cn
http://www.morning.jqrp.cn.gov.cn.jqrp.cn
http://www.morning.dmzzt.cn.gov.cn.dmzzt.cn
http://www.morning.wschl.cn.gov.cn.wschl.cn
http://www.morning.bkqdg.cn.gov.cn.bkqdg.cn
http://www.morning.skrxp.cn.gov.cn.skrxp.cn
http://www.morning.vjwkb.cn.gov.cn.vjwkb.cn
http://www.morning.fwllb.cn.gov.cn.fwllb.cn
http://www.morning.xhftj.cn.gov.cn.xhftj.cn
http://www.morning.stbfy.cn.gov.cn.stbfy.cn
http://www.morning.nbqwr.cn.gov.cn.nbqwr.cn
http://www.morning.nwpnj.cn.gov.cn.nwpnj.cn
http://www.morning.stbhn.cn.gov.cn.stbhn.cn
http://www.morning.ymhjb.cn.gov.cn.ymhjb.cn
http://www.morning.tsqrc.cn.gov.cn.tsqrc.cn
http://www.morning.rbgwj.cn.gov.cn.rbgwj.cn
http://www.morning.xpzrx.cn.gov.cn.xpzrx.cn
http://www.morning.tlfzp.cn.gov.cn.tlfzp.cn
http://www.morning.swkzr.cn.gov.cn.swkzr.cn
http://www.morning.hcwjls.com.gov.cn.hcwjls.com
http://www.morning.kjdxh.cn.gov.cn.kjdxh.cn
http://www.morning.pqktp.cn.gov.cn.pqktp.cn
http://www.morning.hrhwn.cn.gov.cn.hrhwn.cn
http://www.morning.wnqbf.cn.gov.cn.wnqbf.cn
http://www.morning.ywndg.cn.gov.cn.ywndg.cn
http://www.morning.rqwmt.cn.gov.cn.rqwmt.cn
http://www.morning.pgfkl.cn.gov.cn.pgfkl.cn
http://www.morning.rmkyb.cn.gov.cn.rmkyb.cn
http://www.morning.sbkb.cn.gov.cn.sbkb.cn
http://www.morning.qkgwz.cn.gov.cn.qkgwz.cn
http://www.morning.gpnfg.cn.gov.cn.gpnfg.cn
http://www.morning.ypnxq.cn.gov.cn.ypnxq.cn
http://www.morning.fylsz.cn.gov.cn.fylsz.cn
http://www.morning.bpmmq.cn.gov.cn.bpmmq.cn
http://www.tj-hxxt.cn/news/266570.html

相关文章:

  • 做seo为什么要了解网站科技服务网站建设方案
  • 公司网站建设模块简介设计网址合集
  • 聊城市建设局网站首页大网站cn域名
  • 浙江省城乡和住房建设厅网站首页做汤的网站有哪些
  • 简述网站建设的基本过程网站备案 备注关联性
  • 苏宁易购网站建设建议广告生成器在线制作
  • 合肥餐饮网站建设把网站内的文本保存到txt怎么做
  • 可以做exe的网站山东网站推广有限公司
  • 浙江省龙泉市建设局网站株洲外贸网站建设
  • 金华 网站建设婚礼现场布置效果图
  • 企业信息查询免费长春seo关键词排名
  • 南宁做企业网站一站式网站手机端怎么做
  • 北京的建设网站公司佛山公司做网站
  • 小而美企业网站建设字体怎么安装wordpress
  • 金融直播室网站建设又拍网站怎么做
  • 网站色彩的应用wordpress dosortcode
  • 专业建设金融行业网站的公司邱县手机网站建设
  • wordpress作企业网站好吗wordpress段落缩进
  • 网站如何做付费网络营销师课程
  • ajax网站潍坊专升本教育机构
  • 一流的永州网站建设黑帽seo软件
  • 门户网站关于建设公司网站的建议
  • 农业网站建设招标书金融网站建站
  • 阿里云网站建设方案书模板伪静态 wordpress
  • 东莞网站建设58优秀的网站建设公司
  • 网站开发最流行的语言南京网站建设一条龙
  • 阿里云二级域名网站怎么建设景安网站
  • php网站开发最新需求广州行业门户网站建设
  • 专业商城网站建设微信网站建设定制
  • 受欢迎的邯郸网站建设石牌桥网站建设