您的位置:首页 > 编程语言 > C语言/C++

C++智能指针

2015-08-25 17:49 281 查看
说道指针,马上想到的是深拷贝,浅拷贝,所有权,引用计数这些技术。

C++11/14中的四种智能指针,auto_ptr、unique_ptr、shared_ptr和weak_ptr,当然auto_ptr已经被摒弃,除了维护旧代码,已经不建议使用。

智能指针有个 .get() 成员函数用来获得其封装的指针变量,所以判断一个指针指针所指是否为空直接用 if(XXX_ptr)即可(shared_ptr 和unique_ptr 智能指针类都实现了类型转换函数 operator bool()),
否则需要 if(XXX_ptr.get() == nullptr ) 这样来写。

auto_ptr使用的技术是转移所有权,问题在于

auto_ptr<string> p1(new string ("auto")) ;
auto_ptr<string> p2;
if(p2.get() == nullptr)
cout << "hello";
p2 = p1;
if(p1.get() == nullptr)
cout << "world";
p1所指的所有权被p2窃取之后,p1所指为空,此时如果无意对p1 进行操作,程序就会直接崩溃。(实际上auto_ptr的拷贝构造函数是个移动拷贝构造函数的语义,只是auto_ptr实现得早,那时还没有移动拷贝构造函数的说法)。

unique_ptr使用的技术也是转移所有权,不过由于unique_ptr只支持移动构造和移动赋值构造(拷贝构造函数和赋值构造函数被delete),也就是说,unique_ptr只能窃取临时对象的所有权,所以在编译阶段,拷贝构造就会出错,防止所指为空时解引用的运行时错误。

unique_ptr<string> p (new string ("auto"));
unique_ptr<string> p1;
p1 = p;//会报错   赋值构造函数被delete




当然可以使用move() 函数来得到一个临时对象,强制p交出所有权

p1 = move(p);     //注意之后,p所指为空

shared_ptr使用的技术是引用计数,允许多个指针指针对象指向同一个对象。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: