C++11 std::uniqure_ptr指针

C++98引入模板类型”auto_ptr”来实现内存的自动释放,不过由于auto_ptr在拷贝时返回一个左值,不能调用 delete[]等,所以在C++11时被废弃。
有废弃就有增加,C++11采用unique_ptr,shared_ptr,weak_ptr等智能指针来自动回收堆分配的对象。

uniqure_ptr

uniqure_ptr形如其名,与所指对象内存绑定紧密,不能与其它unique_ptr类型的指针对象共享所指对象的内存。
如动态申请一int内存,并初始值为10。

#include<memory>
int _tmain(int argc, _TCHAR* argv[])
{
    std::unique_ptr<int> p1(new int(10));    //编译通过
    std::unique_ptr<int> p2 = p1;            //编译报错
    std::unique_ptr<int> p3 = std::move(p1); //编译通过
}

在程序中,由于p1唯一地指向了new分配的内存,所以p2无法共享其“所有权”。
不过这种所有权可以通过std::move来转移,不过当std::move进行所有权转移后,原指针将不再拥有所有权,所以此时如果再例用原指针,将导致运行时错误。
从实现上讲,unique_ptr是删除了一个拷贝构造函数,保留了移动构造函数的指针封装类型。故当使用右值对unique_ptr进行构造时,一旦构造成功,右值对象的指针被“盗取”,因此右值对像自动失去对指针的所有权,其所有权转给unique_ptr。


scoped_ptr

scoped_ptr是boost库中的叫法,在C++11中,标准委员会正式将这个智能指针引入标准库,但是,划重点了.
在C++11中并不叫scoped_ptr,而是unique_ptr!!!
C++11实现的unique_ptr以后,并没有去实现unique_array,是因为标准库中有vector,其实是很好用.

取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

Powered by bytekits.com,汇天下文字,成非凡梦想!!!