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

为什要做网站公众号和网站先做哪个比较好

为什要做网站,公众号和网站先做哪个比较好,wordpress售后主题,dtcms网站开发http://www.cnblogs.com/TenosDoIt/p/3456704.html 本文介绍c里面的四个智能指针: auto_ptr, shared_ptr, weak_ptr, unique_ptr 其中后三个是c11支持#xff0c;并且第一个已经被c11弃用。 为什么要使用智能指针#xff1a;我们知道c的内存管理是让很多人头疼的事#xff0…http://www.cnblogs.com/TenosDoIt/p/3456704.html 本文介绍c里面的四个智能指针: auto_ptr, shared_ptr, weak_ptr, unique_ptr 其中后三个是c11支持并且第一个已经被c11弃用。 为什么要使用智能指针我们知道c的内存管理是让很多人头疼的事当我们写一个new语句时一般就会立即把delete语句直接也写了但是我们不能避免程序还未执行到delete时就跳转了或者在函数中没有执行到最后的delete语句就返回了如果我们不在每一个可能跳转或者返回的语句前释放资源就会造成内存泄露。使用智能指针可以很大程度上的避免这个问题因为智能指针就是一个类当超出了类的作用域是类会自动调用析构函数析构函数会自动释放资源。下面我们逐个介绍。 auto_ptr 官方文档 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 class Test { public:     Test(string s)     {         str s;        coutTest creat\n;     }     ~Test()     {         coutTest delete:strendl;     }     string getStr()     {         return str;     }     void setStr(string s)     {         str s;     }     void print()     {         coutstrendl;     } private:     string str; }; int main() {     auto_ptrTest ptest(new Test(123));     ptest-setStr(hello );     ptest-print();     ptest.get()-print();     ptest-getStr() world !;     (*ptest).print();     ptest.reset(new Test(123));     ptest-print();     return 0; } 运行结果如下 如上面的代码智能指针可以像类的原始指针一样访问类的public成员成员函数get()返回一个原始的指针成员函数reset()重新绑定指向的对象而原来的对象则会被释放。注意我们访问auto_ptr的成员函数时用的是“.”访问指向对象的成员时用的是“-”。我们也可用声明一个空智能指针auto_ptrTestptest(); 当我们对智能指针进行赋值时如ptest2 ptestptest2会接管ptest原来的内存管理权ptest会变为空指针如果ptest2原来不为空则它会释放原来的资源基于这个原因应该避免把auto_ptr放到容器中因为算法对容器操作时很难避免STL内部对容器实现了赋值传递操作这样会使容器中很多元素被置为NULL。判断一个智能指针是否为空不能使用if(ptest NULL)应该使用if(ptest.get() NULL)如下代码                                                           本文地址 1 2 3 4 5 6 7 8 9 int main() {     auto_ptrTest ptest(new Test(123));     auto_ptrTest ptest2(new Test(456));     ptest2 ptest;     ptest2-print();     if(ptest.get() NULL)coutptest NULL\n;     return 0; } 还有一个值得我们注意的成员函数是release这个函数只是把智能指针赋值为空但是它原来指向的内存并没有被释放相当于它只是释放了对资源的所有权从下面的代码执行结果可以看出析构函数没有被调用。 1 2 3 4 5 6 int main() {     auto_ptrTest ptest(new Test(123));     ptest.release();     return 0; } 那么当我们想要在中途释放资源而不是等到智能指针被析构时才释放我们可以使用ptest.reset(); 语句。 unique_ptr (官方文档)  unique_ptr,是用于取代c98的auto_ptr的产物,在c98的时候还没有移动语义(move semantics)的支持,因此对于auto_ptr的控制权转移的实现没有核心元素的支持,但是还是实现了auto_ptr的移动语义,这样带来的一些问题是拷贝构造函数和复制操作重载函数不够完美,具体体现就是把auto_ptr作为函数参数,传进去的时候控制权转移,转移到函数参数,当函数返回的时候并没有一个控制权移交的过程,所以过了函数调用则原先的auto_ptr已经失效了.在c11当中有了移动语义,使用move()把unique_ptr传入函数,这样你就知道原先的unique_ptr已经失效了.移动语义本身就说明了这样的问题,比较坑爹的是标准描述是说对于move之后使用原来的内容是未定义行为,并非抛出异常,所以还是要靠人肉遵守游戏规则.再一个,auto_ptr不支持传入deleter,所以只能支持单对象(delete object),而unique_ptr对数组类型有偏特化重载,并且还做了相应的优化,比如用[]访问相应元素等. unique_ptr 是一个独享所有权的智能指针它提供了严格意义上的所有权包括 1、拥有它指向的对象 2、无法进行复制构造无法进行复制赋值操作。即无法使两个unique_ptr指向同一个对象。但是可以进行移动构造和移动赋值操作 3、保存指向某个对象的指针当它本身被删除释放的时候会使用给定的删除器释放它指向的对象 unique_ptr 可以实现如下功能 1、为动态申请的内存提供异常安全 2、讲动态申请的内存所有权传递给某函数 3、从某个函数返回动态申请内存的所有权 4、在容器中保存指针 5、auto_ptr 应该具有的功能 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 unique_ptrTest fun() {     return unique_ptrTest(new Test(789)); } int main() {     unique_ptrTest ptest(new Test(123));     unique_ptrTest ptest2(new Test(456));     ptest-print();     ptest2 std::move(ptest);//不能直接ptest2 ptest     if(ptest NULL)coutptest NULL\n;     Test* p ptest2.release();     p-print();     ptest.reset(p);     ptest-print();     ptest2 fun(); //这里可以用因为使用了移动构造函数     ptest2-print();     return 0; } unique_ptr 和 auto_ptr用法很相似不过不能使用两个智能指针赋值操作应该使用std::move; 而且它可以直接用if(ptest NULL)来判断是否空指针release、get、reset等用法也和auto_ptr一致使用函数的返回值赋值时可以直接使用, 这里使用c11 的移动语义特性。另外注意的是当把它当做参数传递给函数时使用值传递应用传递时不用这样传实参时也要使用std::move,比如foo(std::move(ptest))。它还增加了一个成员函数swap用于交换两个智能指针的值 share_ptr (官方文档) 从名字share就可以看出了资源可以被多个指针共享它使用计数机制来表明资源被几个指针共享。可以通过成员函数use_count()来查看资源的所有者个数。出了可以通过new来构造还可以通过传入auto_ptr, unique_ptr,weak_ptr来构造。当我们调用release()时当前指针会释放资源所有权计数减一。当计数等于0时资源会被释放。具体的成员函数解释可以参考 here 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 int main() {     shared_ptrTest ptest(new Test(123));     shared_ptrTest ptest2(new Test(456));     coutptest2-getStr()endl;     coutptest2.use_count()endl;     ptest ptest2;//456引用次数加1“123”销毁     ptest-print();     coutptest2.use_count()endl;//2     coutptest.use_count()endl;//2     ptest.reset();     ptest2.reset();//此时“456”销毁     coutdone !\n;     return 0; } weak_ptr(官方文档) weak_ptr是用来解决shared_ptr相互引用时的死锁问题,如果说两个shared_ptr相互引用,那么这两个指针的引用计数永远不可能下降为0,资源永远不会释放。它是对对象的一种弱引用不会增加对象的引用计数和shared_ptr之间可以相互转化shared_ptr可以直接赋值给它它可以通过调用lock函数来获得shared_ptr。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 class B; class A { public:     shared_ptrB pb_;     ~A()     {         coutA delete\n;     } }; class B { public:     shared_ptrA pa_;     ~B()     {         coutB delete\n;     } }; void fun() {     shared_ptrB pb(new B());     shared_ptrA pa(new A());     pb-pa_ pa;     pa-pb_ pb;     coutpb.use_count()endl;     coutpa.use_count()endl; } int main() {     fun();     return 0; } 可以看到fun函数中pa pb之间互相引用两个资源的引用计数为2当要跳出函数时智能指针papb析构时两个资源引用计数会减一但是两者引用计数还是为1导致跳出函数时资源没有被释放A B的析构函数没有被调用如果把其中一个改为weak_ptr就可以了我们把类A里面的shared_ptrB pb_; 改为weak_ptrB pb_; 运行结果如下这样的话资源B的引用开始就只有1当pb析构时B的计数变为0B得到释放B释放的同时也会使A的计数减一同时pa析构时使A的计数减一那么A的计数为0A得到释放。 注意的是我们不能通过weak_ptr直接访问对象的方法比如B对象中有一个方法print(),我们不能这样访问pa-pb_-print(); 英文pb_是一个weak_ptr应该先把它转化为shared_ptr,如shared_ptrB p pa-pb_.lock();    p-print(); 参考资料 胡健http://www.cnblogs.com/hujian/archive/2012/12/10/2810776.html 胡健http://www.cnblogs.com/hujian/archive/2012/12/10/2810754.html 胡健http://www.cnblogs.com/hujian/archive/2012/12/10/2810785.html 天方http://www.cnblogs.com/TianFang/archive/2008/09/20/1294590.html gaa_rahttp://blog.csdn.net/gaa_ra/article/details/7841204 cplusplushttp://www.cplusplus.com/ 【版权声明】转载请注明出处http://www.cnblogs.com/TenosDoIt/p/3456704.html
http://www.zqtcl.cn/news/660428/

相关文章:

  • 可以赚钱做任务的网站有哪些莘县做网站
  • 可信网站 认证规则山东网站建设代理
  • 网站怎么谈设计常用的软件开发文档有哪些
  • 该怎么给做网站的提页面需求焦作做网站公司
  • 自己做的网站找不到了制作网站问题和解决方法
  • 5118站长平台cento安装wordpress
  • 政务大厅网站建设管理制度wordpress商城移动端
  • 提供中小企业网站建设北京企业网站建设公司哪家好
  • 做海报找图片的网站黑群晖按照wordpress
  • 网站建设与运营市场开拓方案网站首页策划
  • 做国外网站什么好网站快速优化排名排名
  • 如东做网站专注高密网站建设
  • dw网页设计作品简单宁波seo排名方案
  • 网站做微信接口吗小说网站首页模板
  • 网站正在建设中html个人站长做网站需要多少钱
  • 做推广便宜的网站有哪些数据网站建设哪家好
  • 中介网站制度建设wordpress genesis
  • 广东贸易网站开发用数据库做学校网站论文
  • 关于省钱的网站名字东莞哪些网络公司做网站比较好
  • net网站建设多少前MAC怎么做网站
  • 创建网站流程图国内高清图片素材网站推荐
  • 淄博住房和城乡建设局网站建设外贸网站哪家好
  • dede网站地图路径密云区免费网站建设
  • 男女做那事是什 网站软文网
  • 安徽建海建设工程有限公司网站活动推广宣传方案
  • 镇江市建设审图网站关键词优化过程
  • 广州个人网站备案要多久手机软件界面设计
  • 网站建设成都公司哪家好wordpress悬浮代码
  • 制作网站服务公司wordpress文章添加关注公众号
  • 陶瓷企业 瓷砖地板公司网站建设视频解析wordpress