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

网站开发询价表模板下载网站优化排名易下拉系统

网站开发询价表模板下载,网站优化排名易下拉系统,电脑系统做的好的网站,哪个做图网站可以挣钱C中智能指针的原理、使用、实现 转自#xff1a;https://www.cnblogs.com/wxquare/p/4759020.html 1 智能指针的作用 C程序设计中使用堆内存是非常频繁的操作#xff0c;堆内存的申请和释放都由程序员自己管理。程序员自己管理堆内存可以提高了程序的效率#xff0c;但是…C中智能指针的原理、使用、实现 转自https://www.cnblogs.com/wxquare/p/4759020.html 1 智能指针的作用 C程序设计中使用堆内存是非常频繁的操作堆内存的申请和释放都由程序员自己管理。程序员自己管理堆内存可以提高了程序的效率但是整体来说堆内存的管理是麻烦的C11中引入了智能指针的概念方便管理堆内存。使用普通指针容易造成堆内存泄露忘记释放二次释放程序发生异常时内存泄露等问题等使用智能指针能更好的管理堆内存。 理解智能指针需要从下面三个层次 从较浅的层面看智能指针是利用了一种叫做RAII资源获取即初始化的技术对普通的指针进行封装这使得智能指针实质是一个对象行为表现的却像一个指针。 智能指针的作用是防止忘记调用delete释放内存和程序异常的进入catch块忘记释放内存。另外指针的释放时机也是非常有考究的多次释放同一个指针会造成程序崩溃这些都可以通过智能指针来解决。 智能指针还有一个作用是把值语义转换成引用语义。C和Java有一处最大的区别在于语义不同在Java里面下列代码 Animal a new Animal(); Animal b a;你当然知道这里其实只生成了一个对象a和b仅仅是把持对象的引用而已。但在C中不是这样 Animal a; Animal b a;这里却是就是生成了两个对象。关于值语言参考这篇文章http://www.cnblogs.com/Solstice/archive/2011/08/16/2141515.html。 2 智能指针的使用 智能指针在C11版本之后提供包含在头文件memory中shared_ptr、unique_ptr、weak_ptr。 2.1 shared_ptr的使用 shared_ptr多个指针指向相同的对象。shared_ptr使用引用计数每一个shared_ptr的拷贝都指向相同的内存。每使用他一次内部的引用计数加1每析构一次内部的引用计数减1减为0时自动删除所指向的堆内存。shared_ptr内部的引用计数是线程安全的但是对象的读取需要加锁。 初始化。智能指针是个模板类可以指定类型传入指针通过构造函数初始化。也可以使用make_shared函数初始化。不能将指针直接赋值给一个智能指针一个是类一个是指针。例如std::shared_ptr p4 new int(1);的写法是错误的拷贝和赋值。拷贝使得对象的引用计数增加1赋值使得原对象引用计数减1当计数为0时自动释放内存。后来指向的对象引用计数加1指向后来的对象。get函数获取原始指针注意不要用一个原始指针初始化多个shared_ptr否则会造成二次释放同一内存注意避免循环引用shared_ptr的一个最大的陷阱是循环引用循环循环引用会导致堆内存无法正确释放导致内存泄漏。循环引用在weak_ptr中介绍。 #include iostream #include memoryint main() {{int a 10;std::shared_ptrint ptra std::make_sharedint(a);std::shared_ptrint ptra2(ptra); //copystd::cout ptra.use_count() std::endl;int b 20;int *pb a;//std::shared_ptrint ptrb pb; //errorstd::shared_ptrint ptrb std::make_sharedint(b);ptra2 ptrb; //assignpb ptrb.get(); //获取原始指针std::cout ptra.use_count() std::endl;std::cout ptrb.use_count() std::endl;} }2.2 unique_ptr的使用 unique_ptr “唯一” 拥有其所指对象同一时刻只能有一个 unique_ptr 指向给定对象通过禁止拷贝语义、只有移动语义来实现。相比与原始指针unique_ptr用于其RAII的特性使得在出现异常的情况下动态资源能得到释放。unique_ptr指针本身的生命周期从unique_ptr指针创建时开始直到离开作用域。离开作用域时若其指向对象则将其所指对象销毁(默认使用delete操作符用户可指定其他操作)。unique_ptr指针与其所指对象的关系在智能指针生命周期内可以改变智能指针所指对象如创建智能指针时通过构造函数指定、通过reset方法重新指定、通过release方法释放所有权、通过移动语义转移所有权。 #include iostream #include memoryint main() {{std::unique_ptrint uptr(new int(10)); //绑定动态对象//std::unique_ptrint uptr2 uptr; //不能賦值//std::unique_ptrint uptr2(uptr); //不能拷貝std::unique_ptrint uptr2 std::move(uptr); //轉換所有權uptr2.release(); //释放所有权}//超過uptr的作用域內存釋放 }2.3 weak_ptr的使用 weak_ptr是为了配合shared_ptr而引入的一种智能指针因为它不具有普通指针的行为没有重载operator*和-,它的最大作用在于协助shared_ptr工作像旁观者那样观测资源的使用情况。weak_ptr可以从一个shared_ptr或者另一个weak_ptr对象构造获得资源的观测权。但weak_ptr没有共享资源它的构造不会引起指针引用计数的增加。使用weak_ptr的成员函数use_count()可以观测资源的引用计数另一个成员函数expired()的功能等价于use_count()0,但更快表示被观测的资源(也就是shared_ptr的管理的资源)已经不复存在。weak_ptr可以使用一个非常重要的成员函数lock()从被观测的shared_ptr获得一个可用的shared_ptr对象 从而操作资源。但当expired()true的时候lock()函数将返回一个存储空指针的shared_ptr。 #include iostream #include memoryint main() {{std::shared_ptrint sh_ptr std::make_sharedint(10);std::cout sh_ptr.use_count() std::endl;std::weak_ptrint wp(sh_ptr);std::cout wp.use_count() std::endl;if(!wp.expired()){std::shared_ptrint sh_ptr2 wp.lock(); //get another shared_ptr*sh_ptr 100;std::cout wp.use_count() std::endl;}}//delete memory }2.4 循环引用 考虑一个简单的对象建模——家长与子女a Parent has a Child, a Child knowshis/her Parent。在Java 里边很好写不用担心内存泄漏也不用担心空悬指针只要正确初始化myChild 和myParent那么Java 程序员就不用担心出现访问错误。一个handle 是否有效只需要判断其是否non null。 public class Parent {private Child myChild; } public class Child {private Parent myParent; }在C 里边就要为资源管理费一番脑筋。如果使用原始指针作为成员Child和Parent由谁释放那么如何保证指针的有效性如何防止出现空悬指针这些问题是C面向对象编程麻烦的问题现在可以借助smart pointer把对象语义pointer转变为值value语义shared_ptr轻松解决生命周期的问题不必担心空悬指针。但是这个模型存在循环引用的问题注意其中一个指针应该为weak_ptr。 原始指针的做法容易出错 #include iostream #include memoryclass Child; class Parent;class Parent { private:Child* myChild; public:void setChild(Child* ch) {this-myChild ch;}void doSomething() {if (this-myChild) {}}~Parent() {delete myChild;} };class Child { private:Parent* myParent; public:void setPartent(Parent* p) {this-myParent p;}void doSomething() {if (this-myParent) {}}~Child() {delete myParent;} };int main() {{Parent* p new Parent;Child* c new Child;p-setChild(c);c-setPartent(p);delete c; //only delete one}return 0; }循环引用内存泄露的问题 #include iostream #include memoryclass Child; class Parent;class Parent { private:std::shared_ptrChild ChildPtr; public:void setChild(std::shared_ptrChild child) {this-ChildPtr child;}void doSomething() {if (this-ChildPtr.use_count()) {}}~Parent() {} };class Child { private:std::shared_ptrParent ParentPtr; public:void setPartent(std::shared_ptrParent parent) {this-ParentPtr parent;}void doSomething() {if (this-ParentPtr.use_count()) {}}~Child() {} };int main() {std::weak_ptrParent wpp;std::weak_ptrChild wpc;{std::shared_ptrParent p(new Parent);std::shared_ptrChild c(new Child);p-setChild(c);c-setPartent(p);wpp p;wpc c;std::cout p.use_count() std::endl; // 2std::cout c.use_count() std::endl; // 2}std::cout wpp.use_count() std::endl; // 1std::cout wpc.use_count() std::endl; // 1return 0; }正确的做法 #include iostream #include memoryclass Child; class Parent;class Parent { private://std::shared_ptrChild ChildPtr;std::weak_ptrChild ChildPtr; public:void setChild(std::shared_ptrChild child) {this-ChildPtr child;}void doSomething() {//new shared_ptrif (this-ChildPtr.lock()) {}}~Parent() {} };class Child { private:std::shared_ptrParent ParentPtr; public:void setPartent(std::shared_ptrParent parent) {this-ParentPtr parent;}void doSomething() {if (this-ParentPtr.use_count()) {}}~Child() {} };int main() {std::weak_ptrParent wpp;std::weak_ptrChild wpc;{std::shared_ptrParent p(new Parent);std::shared_ptrChild c(new Child);p-setChild(c);c-setPartent(p);wpp p;wpc c;std::cout p.use_count() std::endl; // 2std::cout c.use_count() std::endl; // 1}std::cout wpp.use_count() std::endl; // 0std::cout wpc.use_count() std::endl; // 0return 0; }3 智能指针的设计与实现 下面是一个简单智能指针的demo。智能指针类将一个计数器与类指向的对象相关联引用计数跟踪该类有多少个对象共享同一指针。每次创建类的新对象时初始化指针并将引用计数置为1当对象作为另一对象的副本而创建时拷贝构造函数拷贝指针并增加与之相应的引用计数对一个对象进行赋值时赋值操作符减少左操作数所指对象的引用计数如果引用计数为减至0则删除对象并增加右操作数所指对象的引用计数调用析构函数时构造函数减少引用计数如果引用计数减至0则删除基础对象。智能指针就是模拟指针动作的类。所有的智能指针都会重载 - 和 * 操作符。智能指针还有许多其他功能比较有用的是自动销毁。这主要是利用栈对象的有限作用域以及临时对象有限作用域实现析构函数释放内存。 #include iostream #include memorytemplatetypename T class SmartPointer { private:T* _ptr;size_t* _count; public:SmartPointer(T* ptr nullptr) :_ptr(ptr) {if (_ptr) {_count new size_t(1);} else {_count new size_t(0);}}SmartPointer(const SmartPointer ptr) {if (this ! ptr) {this-_ptr ptr._ptr;this-_count ptr._count;(*this-_count);}}SmartPointer operator(const SmartPointer ptr) {if (this-_ptr ptr._ptr) {return *this;}if (this-_ptr) {(*this-_count)--;if (this-_count 0) {delete this-_ptr;delete this-_count;}}this-_ptr ptr._ptr;this-_count ptr._count;(*this-_count);return *this;}T operator*() {assert(this-_ptr nullptr);return *(this-_ptr);}T* operator-() {assert(this-_ptr nullptr);return this-_ptr;}~SmartPointer() {(*this-_count)--;if (*this-_count 0) {delete this-_ptr;delete this-_count;}}size_t use_count(){return *this-_count;} };int main() {{SmartPointerint sp(new int(10));SmartPointerint sp2(sp);SmartPointerint sp3(new int(20));sp2 sp3;std::cout sp.use_count() std::endl;std::cout sp3.use_count() std::endl;}//delete operator }参考 值语义http://www.cnblogs.com/Solstice/archive/2011/08/16/2141515.htmlshared_ptr使用http://www.cnblogs.com/jiayayao/archive/2016/12/03/6128877.htmlunique_ptr使用http://blog.csdn.net/pi9nc/article/details/12227887weak_ptr的使用http://blog.csdn.net/mmzsyx/article/details/8090849weak_ptr解决循环引用的问题http://blog.csdn.net/shanno/article/details/7363480C面试题四——智能指针的原理和实现
http://www.huolong8.cn/news/138880/

相关文章:

  • dw网站建设的心得体会wordpress 首页白屏
  • 那个网站可以做网站测速对比安泽网站建设
  • 建站公司山东济南兴田德润简介数据分析网站
  • 湛江做网站从wordpress 响应分页
  • 徐州网站建设制作工作室平面设计跟网站建设
  • 网站打开的速度特别慢的原因旅游网站系统wordpress
  • 做网站 写文章怎样加视频新网站建设教程
  • 网站后台的用户名网站域名区别
  • 海南省建设信息官方网站如何网站做百度推广
  • 深圳网站平台制作常州第一门户网
  • 礼品公司网站源码wordpress模板极简
  • 室内设计公司免费网站百度分公司
  • 用凡科网做网站怎么保存到桌面东莞手机微信网站制作
  • 商家网站建设wordpress 加载数据库表格
  • 网站管理是做什么的手机软件卸载了怎么恢复
  • asp.net网站支持多国语言域名购买教程
  • 网站开发者工具下载深圳短视频推广收费
  • 政务服务中心网站建设总结商业摄影网站
  • 网站制作模板专业网站建站
  • wordpress企业网站实例网站关键词快照优化
  • 怎样开网站施工企业部门目标责任书
  • 新闻资讯网站模板下载济宁住房和城乡建设厅网站
  • 杭州品牌网站dtu网站开发
  • 建动画网站需要多少钱古色古香的网站模板
  • 网站的首页设计方案新闻稿件
  • 铁岭免费网站建设专业网站建设比较好
  • 做ppt什么网站图片好佛山市骏域网站建设专家
  • 某企业集团网站建设方案论文腾讯企业邮箱登录入口二维码
  • 门户网站建设流程网站登录页做多大尺寸的
  • 如何做简单网站首页沈阳招聘网官网