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使用的技术是转移所有权,问题在于
unique_ptr使用的技术也是转移所有权,不过由于unique_ptr只支持移动构造和移动赋值构造(拷贝构造函数和赋值构造函数被delete),也就是说,unique_ptr只能窃取临时对象的所有权,所以在编译阶段,拷贝构造就会出错,防止所指为空时解引用的运行时错误。
当然可以使用move() 函数来得到一个临时对象,强制p交出所有权
shared_ptr使用的技术是引用计数,允许多个指针指针对象指向同一个对象。
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使用的技术是引用计数,允许多个指针指针对象指向同一个对象。
相关文章推荐
- C++ List 双向链表 实现 会用也要会写
- C语言动态内存分配函数解析
- const的常见用法
- 排序算法之希尔排序(C语言实现)
- MFC视频教程(孙鑫)学习笔记2-掌握C++
- 一个包含所有c++的头文件的头文件
- 程序崩溃时自动记录minidump的c++类
- C语言多文件编译
- 常见的字符串匹配算法对比实现C语言版本
- Effective C++ 条款22 将成员变量声明为private
- 黑马程序员——C语言中的标识符
- 常见的排序算法对比及实现C语言版本
- C++ 关键字typeid 运行时类型检查
- Effective C++ 条款21必须返回对象时,别妄想返回其reference
- C/C++的编译与运行
- C++中空类的大小
- C++中类对象所占空间的大小
- 常见的查找算法C语言版本
- 【深入理解C++】从初始化列表和构造函数谈C++的初始化机制
- c++常见面试题30道