|

尽量避免在大多数代码中使用指针实现。
使用现代C ++,您几乎不需要传递指针,可以依赖引用,并且编译器本身可以进行优化以避免不必要的复制和自动转移所有权。但不总是。
智能指针的用例仍然存在。如果必须动态创建对象并将其返回到调用堆栈,则希望它们在超出范围时释放自己。如果找不到确定的位置来删除对象,或者无法确定要删除该对象的对象,那么智能指针是一个很好的解决方案。
unique_ptr的一些优点是:
您知道您的smart_ptr将持续存在,直到不再位于任何范围内,并且没有函数或类会意外地将其销毁。
整个代码路径中指向的对象将只有一个销毁。
unique_ptr并不是一个真正的指针,它的行为就像一个透明的指针,将调用转发到它所连接的对象。它不能“悬挂”并且不能为空。
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++编程!弯道超车,快人一步!
分享(源码、项目实战视频、项目笔记,基础入门教程)
欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!
编程学习软件分享:
编程学习视频分享:
|
|