智能指针是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.
网友评论