C++智能指针使用总结

C++智能指针使用总结


C++提供了4种智能指针用于对分配的内存进行自动释放,这些智能指针如下:

      auto_ptr、unique_ptr、shared_ptr、weak_ptr。其中auto_ptr在C++98标准引入,后三种在C++11标准中加入。而auto_ptr已经被C++11所摒弃,建议使用后三种智能指针,这4种智能指针使用模板(template)实现。在此总结下个人对这4种智能指针肤浅认识。

C++智能指针简介

  1. 1

           C++智能指针是行为类似于指针的类对象。它使用设计模式中的代理模式,代理了原始“裸”指针的行为,为指针添加了更多更有用的特性。

           C++引入异常机制后,智能指针由一种技巧升级为一种非常重要的技术,因为如果没有智能指针,程序员必须保证new对象能在正确的时机delete,四处编写异常捕获代码释放资源,而智能指针则可以在退出作用域时——不管是正常离开或是因异常离开——总调用delete来析构在堆栈上动态分配的对象。

           因为C++异常处理的真正功能在于它具有为异常抛掷前构造的所有局部对象(那么智能指针对象也适用)自动调用析构函数的能力(C++异常机制不仅仅在于它能够处理各种不同类型的异常)。所以在异常退出智能指针对象作用域时,总能由C++异常机制调用析构函数释放在堆栈上动态分配的对象。

           当然,正常退出对象(智能指针对象也属于此列)作用域也会自动调用析构函数释放在堆栈上动态分配的对象。

           由此可知,将“裸”指针包装成智能指针对象可以实现动态分配的内存对象的自动释放。

           而且C++智能指针对象可以像原指针那样直接使用运算符,如赋值运算符'=',指针运算符'->',解引用运算符'*'。这点可以从下面的”shared_ptr智能指针--shared_ptr模板类摘要“部分可以印证。

    END

auto_ptr智能指针(C++98)

  1. 1

    所属头文件:#include <memory>

    所属命名空间及标识符:using std::shared_ptr;

    所属版本:C++98

    g++启用版本命令:g++ -std=c++98 -c -o

    补充:

           如果启用c++11及以上标准,即g++ -std=c++11 -c -o,编译时会有一个警告信息提示

    warning:‘auto_ptr’ is deprecated  (‘auto_ptr‘被反对使用)

  2. 2

           存在很多种智能指针,其中最有名的应该是C++98标准中的“自动指针”std::auto_ptr,它部分解决了获取资源自动释放的问题,例如:

    #include

    #include

    #include

    using std::cin;

    using std::cout;

    using std::string;

    using std::auto_ptr;

    class Report

    {

    private:

        std::string str;

    public:

        Report( const string s ):str(s) { cout << "Object created!\n"; }

        ~Report() { cout << "Object deleted!\n"; }

        void comment(string owner) const { cout << owner << str << "\n"; }

    };

    int main(void)

    {

            auto_ptr ps (new Report("Using auto_ptr."));

            ps->comment(string("ps:"));

            auto_ptr p1;

            p1 = ps;  //赋值完毕后ps已经失去对内存对象的所有权,不可再使用

            p1->comment(string("p1:"));

            //ps->comment(string("after p1=ps:"));  //error,Segmentation faul

    }

    /*Result:

    Object created!

    Using auto_ptr.

你可能感兴趣的:(c/c++,智能指针,c++11,指针)