尽可能避免在大多数代码中使用指针实现。编程
使用现代C ++,您几乎不须要传递指针,能够依赖引用,而且编译器自己能够进行优化以免没必要要的复制和自动转移全部权。但不老是。微信
智能指针的用例仍然存在。若是必须动态建立对象并将其返回到调用堆栈,则但愿它们在超出范围时释放本身。若是找不到肯定的位置来删除对象,或者没法肯定要删除该对象的对象,那么智能指针是一个很好的解决方案。函数
unique_ptr的一些优势是:学习
您知道您的smart_ptr将持续存在,直到再也不位于任何范围内,而且没有函数或类会意外地将其销毁。优化
整个代码路径中指向的对象将只有一个销毁。线程
unique_ptr并非一个真正的指针,它的行为就像一个透明的指针,将调用转发到它所链接的对象。它不能“悬挂”而且不能为空。3d
unique_ptr的开销几乎与原始指针相同,即几乎没有。没有使用原始指针的加速。指针
shared_ptr用于由多个线程,对象等共享(更震惊!)的资源。它们在时间和内存上的使用比unique_ptr昂贵,可是它们解决了在使用对象的函数结束时保持活动对象的难题。他们为咱们提供了一个参考计数器和原子访问。在垃圾回收语言中,引用计数由运行时线程保留,但C ++ shared_ptr保留其引用计数。在大多数程序中,shared_ptr的用例少于unique_ptr。视频
如何避免使用智能指针泄漏:对象
一般,他们为您完成工做,但有几件事:
1.建立对象后,当即将其分配给指针。
Object * myobject = new Object(“ pi”,3.14159);
unique_ptr op(myobject);
std :: cout << op-> getname()<< std:endl;
2. 仅使用smart_pointer,不要再使用原始指针。
std :: cout << myobject-> getname()<< std:endl; //坏
//永远不要在原始指针上调用delete。
3.仅在unique_ptr内部访问该对象以复制该对象。
您不能复制unique_ptr。若是须要复制对象,
则应使用unique_ptr :: get()和new一块儿将副本分配
给另外一个unique_ptr。
unique_ptr o2(* op); //简短,但错误。
unique_ptr o2(new Object(* op)); // 对
4.将unique_ptrs做为unique_ptrs传递给函数,或者取消引用它们并将它们做为const引用传递。
5.若是函数必须拥有unique_ptr的全部权,则将其移入函数。
6. shared_ptr可使用赋值()复制,a = b但不要将a从新分配给另外一个shared_ptr,不然引用计数将减小。若是达到0,它将自行删除。
7.不要尝试从静态分配的对象中建立unique_ptr或shared_ptr。编译器可能会让您在编译时没法使用它,可是当静态分配的对象自行销毁而且智能指针随后尝试删除它时,它将致使内存错误。仅用于动态分配的对象!
8.不要new与。(C ++ 14)一块儿使用std::make_unique。它代替new来进行内存分配。
但愿对你有帮助!
另外若是你想更好的提高你的编程能力,学好C语言C++编程!弯道超车,快人一步!
C语言C++编程学习交流圈子,QQ群757874045【点击进入】微信公众号:C语言编程学习基地
分享(源码、项目实战视频、项目笔记,基础入门教程)
欢迎转行和学习编程的伙伴,利用更多的资料学习成长比本身琢磨更快哦!
编程学习软件分享:
编程学习视频分享: