美文网首页
c++智能指针

c++智能指针

作者: 黑白配ly | 来源:发表于2018-06-29 17:52 被阅读15次

    智能指针是C++中为了方便动态资源的管理而设置的。

    通常情况下,在new了一个资源之后,用完之后,我们需要手动的delete它,要不然会造成内存泄漏。
    这是因为指针变量在超出作用范围之后,之后销毁指针变量本身,对于它拥有的资源它不会去释放。
    这个也是引入智能指针的背景。智能指针的思路就是,在智能指针超出作用范围之后,不需要手动释放资源,智能指针可以帮助我们去将其拥有的资源也回收掉,这对于代码减少了内存泄漏的风险,同时,代码也更加的整洁。

    智能指针的实现原理,其实就是在创建时去new资源,在智能指针的析构函数里去delete拥有的资源。
    所有的智能指针都是基于此原理的,其他的都是小的差异。

    智能指针分类,有auto_ptr(此指针被废弃了,尽量不要用了。auto_ptr的实现并不好),unique_ptr(凡是有auto_ptr的场景,都可以用unique_ptr来代替。),unique_ptr是一个unique的指针,意思就是这个指针独有的拥有这个资源,你不能把这个智能指针赋给另外一个智能指针。当unique_ptr超出作用范围之后,其拥有的资源也被释放了。
    shared_ptr可以共享资源的智能指针,就是一个资源可以被多个指针指针拥有,这就是共享。只有当所有的共享指针都超出作用域了的时候,才可去释放资源。这个是与unique_ptr所相对的。unique_ptr可以转shared_ptr,反过来不行。
    weak_ptr智能指针,这个指针并没有资源的拥有权,因此在最后共享的资源的拥有的各个智能指针里不算它,这样可以规避一类多个指针的共享资源释放时的循环的依赖问题。此weak指针可以转成shared_ptr类型的指针,然后再去访问资源。
    另外,智能指针当然可以使用构造函数来创建,但是推荐使用std::make_unique()和std::make_shared()。

    附上看到的关于c++三类指针的解释。
    std::unique_ptr is the smart pointer class that you should probably be using. It manages a single non-shareable resource. std::make_unique() (in C++14) should be preferred to create new std::unique_ptr. std::unique_ptr disables copy semantics.

    std::shared_ptr is the smart pointer class used when you need multiple objects accessing the same resource. The resource will not be destroyed until the last std::shared_ptr managing it is destroyed. std::make_shared() should be preferred to create new std::shared_ptr. With std::shared_ptr, copy semantics should be used to create additional std::shared_ptr pointing to the same object.

    std::weak_ptr is the smart pointer class used when you need one or more objects with ability to view and access a resource managed by a std::shared_ptr, but unlike std::shared_ptr, std::weak_ptr is not considered when determining whether the resource should be destroyed.

    相关文章

      网友评论

          本文标题:c++智能指针

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