嵌入式C/C++语言相关知识——智能指针shared_ptr、unique_ptr、weak_ptr
一、博客声明
又是一年一度的秋招,怎么能只刷笔试题目呢,面试题目也得看,想当好厂的牛马其实也不容易呀O(∩_∩)O。注意:这篇博客大部分是来自网上的资源,我只是为了加深印象,总结和抄一遍,没错,就是抄一遍。
二、智能指针
智能指针是一种C++的类模板,用于自动管理动态分配的内存资源。与普通指针不同,智能指针可以在对象不再使用时自动释放内存,从而避免内存泄漏。智能指针通过构造函数和析构函数来管理对象的生命周期,当智能指针超出作用域或者被显式重置时,会自动调用适当的析构函数来释放资源。
使用智能指针的好处:极大地简化了内存管理,减少了手动管理内存的复杂性和错误。
下面介绍常用的智能指针类型,需要包含#include <memory>
。
1、shared_ptr
被称为共享智能指针:一个共享所有权的智能指针,多个shared_ptr
可以指向同一个对象,只有当最后一个shared_ptr
超出作用域时,资源才会被释放。该指针使用引用计数来管理资源的生命周期。
特点:
1、共享所有权:多个指针管理一个对象
2、线程安全:内部的弱引用机制时线程安全的,可以在多线程环境中安全使用。
适用场景:共享资源管理、复制对象关系、避免内存泄漏。
2、unique_ptr
被称为独占智能指针:一个独占所有权的智能指针,确保任何时候,只有一个智能指针可以拥有所指向的对象。当unique_ptr
超出作用域时,它会自动释放资源,该指针不能被复制,但是可以移动。
特点:
1、独占所有权:只有一个指针可以管理该对象。
2、不可复制:只支持移动操作,不运行复制
适用场景:独占资源管理、临时对象、避免动态内存管理的复杂性。
2、weak_ptr
被称为弱引用智能指针:是与shared_ptr
配合使用的智能指针,不会增加引用计数。它用于解决shared_ptr
之间循环引用的问题。当需要访问由shared_ptr
管理的对象但不希望影响其生命周期时,可以使用weak_ptr
.
特点:
1、不参与所有权管理:不会影响所指向对象的引用计数,因此不会延长对象的生命周期。
2、打破循环引用:与shared_ptr
结合使用,避免循环引用导致内存泄漏。
3、安全访问:通过 lock()
方法,可以安全地获取一个指向同一对象的 shared_ptr。
适用场景:解决循环引用、观察者模式、资源临时访问。