美文网首页
智能指针

智能指针

作者: Felicia1993 | 来源:发表于2017-10-17 19:48 被阅读0次

    理解智能指针从三个层面:

    1. 智能指针使用RAII(资源获取初始化)对普通的指针进行封装,使得智能指针实质上是一个对象,行为表现的却像一个指针。

    2.指针把值语义转化成引用语义

    std::auto_ptr,  boost::shared_ptr,  unique_str, weak_str

    1.std::auto_ptr(已被摒弃):不支持复制(拷贝构造函数)和赋值(operator =),直接赋值不会编译出错,很大的缺陷是所有权的转移,就是一个对象的内存块智能呗一个智能指针对象所拥有。

    原因:

    auto_ptr<string> ps (new string("I reigned lonely as a cloud."))

    auto_ptr<string> vocation;

    vocation = ps;

    上述代码试图将两个指针指向同一个对象,会导致程序删除一个对象两次

    避免这种问题的几个解决办法:

    1.定义赋值运算,执行深复制,这样两个指针将指向不同的对象,其中一个对象是另一个对象的副本

    2.建立所有权概念,对于特定的对象,只能有一个指针可拥有它。这样只有拥有对象的智能指针的构造函数会删除该对象。

    3.创建智能更高的指针,跟踪引用特定对象的智能指针数。称为引用计数。

    2.unique_str:

    上述赋值代码会报编译错误

    3.shared_ptr:可以作为STL容器的元素,用于管理单个堆内存对象,共享所有权

    和auto_ptr不同的地方:

    1。在内部使用了引用计数share_count,用来表示当前有多少个智能指针对象共享对象指向的内存块

    2.析构函数中不失直接释放指针对应的内存块,如果shared_count大于1则不释放内存指是将引用计数减1,指示计数等于1时释放内存

    3.复制构造与赋值操作符只是提供一般意义上的复制功能,并且将计数加1

    相关文章

      网友评论

          本文标题:智能指针

          本文链接:https://www.haomeiwen.com/subject/ixviyxtx.html