zoukankan      html  css  js  c++  java
  • C++ 智能指针 shared_ptr

      今天晚上去旁听了C++高级编程的课,其中提到智能指针。第一反映还以为是auto_ptr呢,一听才知道是share_ptr这个。哦,原来是C++11特性。大致的原因是auto_ptr有一点缺陷,而share_ptr比较安全。好吧,那就这个了。
      先写一个简单的代码感受一下

     1 #include <iostream>
     2 #include <tr1/memory>
     3 
     4 using namespace std;
     5 using std::tr1::shared_ptr;
     6 
     7 int main()
     8 {
     9     {
    10         shared_ptr<double> pp(new double(22.22));
    11         {
    12             shared_ptr<double> pp_copy = pp;
    13             *pp_copy=11.11;
    14         }//在这个作用域中pp_copy会自动销毁,但是分配给pp的double不会别销毁。
    15         cout<<"pp="<<*pp<<endl;
    16     }//此时pp会自动销毁,动态分配的double会被销毁,因为已经没有指针指向它。
    17     return 0;
    18 }

      其实只是看上面的代码,觉得好像没有实际的作用。

     1 int main()
     2 {
     3     double * pp = new double(22.22);
     4     {
     5         double * pp_copy = pp;
     6         *pp_copy=11.11;
     7         delete pp_copy;
     8     }
     9     cout<<"pp="<<*pp<<endl;//输出的数值是脏数据 pp成了悬垂指针
    10     return 0;
    11 }

      到这里你可能会说那个delete不用不就行了?其实是的。只要小心使用delete就行。可是有没有想过,但代码量很大的时候,就不知道是不是要delete了,这就会造成内存泄漏了。

    1     double * pp = new double(22.22);
    2     double * pp_copy = new double(22.22);
    3     //delete pp_copy;
    4     pp_copy = pp;
    5     *pp_copy=11.11;

      就像这样如果没有delete就会内存泄漏。如果是使用智能指针,那么执行上面第4行语句时,会释放第二行分配的内存。

      总结: 智能指针是为了实现类似于Java中的垃圾回收机制(gc)。Java的垃圾回收机制使程序员从繁杂的内存管理任务中彻底的解脱出来,在申请使用一块内存区域之后,无需去关注应该何时何地释放内存,Java将会自动帮助回收。但是出于效率和其他原因(可能C++设计者不屑于这种傻瓜氏的编程方式),C++本身并没有这样的功能,其繁杂且易出错的内存管理也一直为广大程序员所诟病。<<引用>>

    运行环境: Win7 + codeblock 12.11

    资料:
    auto_ptr与share_ptr的区别:http://www.cppblog.com/expter/archive/2009/03/29/78270.html
    悬垂指针与野指针:
    http://www.cnblogs.com/submarine/archive/2013/03/02/2940169.html
    引用:
    http://blog.163.com/bbluesnow@126/blog/static/27784545201222682418694/

  • 相关阅读:
    Monogb基本概念及基本操作
    高级查询与索引
    查询、索引和聚合
    更新和删除文档
    数据查询
    数据库和集合的基本操作
    dedecms 文章排列方式
    dedecms flag标签属性
    Iis 日志文件默认路径
    php中的require() 语句的使用方法
  • 原文地址:https://www.cnblogs.com/wunaozai/p/3599668.html
Copyright © 2011-2022 走看看