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

有名的网站制国家建设信息公示平台

有名的网站制,国家建设信息公示平台,网站建设方案的征求意见,网站开发培训训文章目录 一、智能指针驱动的RAII二、shared_ptr 和 weak_ptr三、如何复制 RAII 对象四、在资源管理类中应该提供对原始资源的访问函数 为了防止忘记调用 delete 造成的内存泄露#xff0c;我们应该尽可能让对象管理资源#xff0c;并且采用 RAII 机制(Resource Acquisition … 文章目录 一、智能指针驱动的RAII二、shared_ptr 和 weak_ptr三、如何复制 RAII 对象四、在资源管理类中应该提供对原始资源的访问函数 为了防止忘记调用 delete 造成的内存泄露我们应该尽可能让对象管理资源并且采用 RAII 机制(Resource Acquisition is Initialize)机制让析构函数负责资源的释放。 一、智能指针驱动的RAII 在cpp11中可以使用unique_ptr 或者 shared_ptr两种智能指针来管理内存。其中 unique_ptr 通过专一所有权来管理 RAII 的对象而shared_ptr通过引用计数来管理。 std::unique_ptr pUniqueInv1(CreateInvestment()); std::unique_ptr pUniqueInv2(std::move(pUniqueInv1)); std::shared_ptr pSharedInv1(CreateInvestment()); std::shared_ptr pSharedInv2(pSharedInv1); / std::shared_ptr pSharedInv2(std::move(pSharedInv1)) std::move(pSharedInv1)返回的是pSharedInv1的右值引用也就是一个std::shared_ptr类型在执行完这句之后pSharedInv1就变成了一个空指针 nullptr而pSharedInv2现在拥有原本属于pSharedInv1 的对象。 请注意在调用std::shared_ptr 的移动构造函数的时候shared_ptr的引用技术不变。 智能指针默认会自动 delete 所持有的对象我们也可以为智能指针指定所管理对象的释放方式删除器deleter): // void GetRidOfInvestment(Investment*) {} std::unique_ptrInvestment, decltype(GetRidOfInvestment)* pUniqueInv(CreateInvestment(), GetRidOfInvestment); std::shared_ptr pSharedInv(CreateInvestment(), GetRidOfInvestment); 在这里decltype的作用是: 二、shared_ptr 和 weak_ptr 一个很常见的面试问题是能否使用 weak_ptr来实现 RAII 答案显然是否定的。 首先介绍一下weak_ptr, weak_ptr是一种用于解决 shared_ptr的循环计数死锁的智能指针。一个例子如下 #include memory #include vectorclass Child;class Parent { public:std::vectorstd::shared_ptrChild children;void addChild(const std::shared_ptrChild child) {children.push_back(child);}~Parent() {// 析构函数} };class Child { public:std::shared_ptrParent parent;Child(const std::shared_ptrParent p) : parent(p) {}~Child() {// 析构函数} };可以看到 child 和 parent 互相持有对方的shared_ptr, 造成循环引用。 哪怕当这些对象超出作用御的时候他们的析构函数也不会被调用从而导致内存泄露。 为了解决这个问题我们可以使用 weak_ptr 解决循环引用我们可以把 Child 中的shared_ptr 改成 weak_ptr : class Child { public:std::weak_ptrParent parent; // 使用 weak_ptr 而非 shared_ptrChild(const std::shared_ptrParent p) : parent(p) {} //这里参数仍然是shapred_ptr 因为 1. shared_ptr weak_ptr 转换是兼容的。 2.确保有一个 shared_ptrParent存在保证 Parent 对象存活。~Child() {// 析构函数} };三、如何复制 RAII 对象 引用计数 正如 shared_ptr一样对于每一个资源对象的每一次复制就让引用计数 1 每一个对象离开定义域调用析构函数使得引用计数 - 1 直到引用计数为 0 就把资源销毁。 深拷贝 在拷贝的时候不但copy 对象同时 copy 底层资源比如: 请注意在拷贝的时候有三点是非常需要注意的: 1.是否拷贝了底层资源对象 2.是否 handle 了自赋值 3.是否 handle 了异常处理 #includeiostream #includecstringclass RAIIArray { public:RAIIArray(const char* str) {if(str) {len_ std::strlen(str) 1;data_ new char[len];strcpy(data_, str);} else {data_ nullptr;len_ 0;}}//Deepcopy for Copy Constructor RAIIArray(const RAIIArray other) { size_ other.size_;if(size_ 0) {data_ new char[size_];std::strcpy(data_, other.data_);} else { data_ nullptr;}}//Deepcopy for operator RAIIArray operator(const RAIIArray other) { //Identity Judgementif(this ! other) {delete data;size other.size;if(size 0) {data new char[size];std::strcpy(data, other.data); } else {data nullptr;size 0;}} return *this;}//You can also use this : first explicit call copy constructor then copy swapRAIIArray operator(const RAIIArray other) { if(this ! other) {RAIIArray temp(other); //显shi 调用了拷贝构造函数swap(*this, other);}return *this;}//use friend to access the private variables in first and second friend void swap( RAIIArray first, RAIIArray second) {using std::swap;swap(first.size, second.size);swap(first.data, second.data);}//Deepcopy with copy-and-swapRAIIArray operator(RAIIArray other) { swap(*this,other);return *this;}}转移底层资源所有权 和std::unique_ptr类似永远保持只有一个对象拥有对资源的管理权当需要复制对象的时候转移资源的管理权。 四、在资源管理类中应该提供对原始资源的访问函数 和所有的智能指针一样stl 中的智能指针也提供了对原始资源的隐藏访问和显示访问 Investment* pRaw pSharedInv.get(); // 显示访问 Investment raw *pSharedInv; //隐式访问 这里pSharedInv是一个 shared_ptr, 指向Investment类型 当我们自己在设计自己的资源管理类的时候也要考虑在提供原始资源访问的同时是使用显示还是隐式方法。 比如: class Font
http://wiki.neutronadmin.com/news/391168/

相关文章:

  • 成品网站包含后台么ppt背景图免费
  • 上海专业网站建设方案wordpress在线查询系统
  • 网站运营岗位介绍苏州市吴江区住房和城乡建设局网站
  • 网站建设需要学习什么wordpress怎么添加附件
  • qq邮箱做网站虎嗅wordpress
  • 企业网站搭建教程装修公司谁做网站
  • 简创网站建设费用北京中小企业网站建设公司
  • 企业网站的必要性凌风wordpress教程
  • iis html网站wordpress显示文章id
  • 网站建设与运营预算网站正在建设中 手机版
  • 个人建设网站建筑网上接活平台
  • 郴州公司网站建设制作动画的网站
  • 商务贸易网站建设展示形网站开发
  • 做昆虫类论文网站平顶山建设网站
  • 西安建设科技专修学院网站不同网站对商家做o2o的政策
  • linux系统网站架构开源众包官网兼职平台
  • 做网站建设科技公司东方甄选采用了哪些网络营销方式
  • 现代网站制作wordpress的知名网站
  • 建设银行官网站下载免费素材网站pexels
  • 做网站哪家服务器好自助免费建站系统
  • c2c网站支付方式河南建设工程教育网
  • 怎么在百度上面做网站seo优化对网店的推广的作用为
  • 一个成功的网站必须具备百度关键词挖掘工具
  • 网站建设设计制作培训网站建设教程视频西瓜
  • 黄村网站开发公司一流的学校网站建设
  • 临淄网站制作首选专家搜索引擎seo如何优化
  • 网站个人备案流程北京市住房和城乡建设网官网
  • 昆明网站建设SEO公司网上贸易平台有哪些
  • 知名外贸网站建设公司公司注销查询系统
  • 拖拽式网站建设费用河源网站开发