本篇文章来介绍一下C++高频面试题 智能指针。
1.智能指针高频问题:
接下来我会为大家一 一解读:
2.智能指针的由来:
在实际开发中 遇到的困境:
3.智能指针的核心是采用RAII思想来自动化管理指针指向的动态资源的释放(必答)
4.智能指针的种类
shared_ptr :强引用计数 注意死锁 有拷贝构造 拷贝赋值构造 移动构造 资源没有明确的拥有者
使用shared_ptr管理动态资源的时候 不建议使用裸指针 尽量用make_shared来初始化 不要用get来初始化裸指针
unique_ptr:独占指针 没有拷贝构造 没有拷贝赋值构造 仅仅有移动构造和移动赋值
weak_ptr:弱引用技术 解决强引用计数带来的死锁问题
5.shared_ptr底层实现:
shared_ptr里面有两个指针
ptr to T :指向类型 T Object
ptr to Control Block:另一个指向控制块 Control Block
Reference Count:表示强引用技术
Weak Count 弱引用技术
Other data:其他数据
deleter:删除器
allocator:分配器
6.shared_ptr和unique_ptr的区别:
一个是共享指针(共享所有权) 另一个是独占是指针(独占所有权)
7.线程安全
1.shared_ptr 在引用上是线程安全的
2.shared_ptr管理对象的访问仍然需要加锁解决问题
8.尽量使用make_shared
make_shared会产生一个控制块(T Object和Control Count会连接在一起)
但是其他初始化的方式会有两个控制块(T Object和Control Block是分开的)
使用make_shared可以避免多次创建内存 也可以避免使用裸指针
9.不能在内部返回this
这样做会创建一个新的智能指针实例,它指向同一个对象,但有一个独立的引用计数。这会导致引用计数管理变得混乱,可能会在某个时候错误地删除对象(当两个智能指针的引用计数都变为零时),或者当对象应该被删除时却因为没有智能指针指向它而未被删除。
采用继承enable_shared_from_this 以及返回shared_from_this来实现
class T:public enable_shared_from_this<T>{public:shared_ptr<T> self(){return shared_from_this();}
}
10.结合STL库来实现shared_ptr(这里使用的是vector):
#include <iostream>
#include <memory>
#include <vector>
using namespace std;
class MyClass {
public:MyClass(int value) : value_(value) {cout << "MyClass(" << value_ << ") constructed\n";}~MyClass() {cout << "MyClass(" << value_ << ") destroyed\n";}void print() const {cout << "MyClass(" << value_ << ")\n";}private:int value_;
};int main() {vector<std::shared_ptr<MyClass>> vec;// 添加shared_ptr到vector中vec.push_back(std::make_shared<MyClass>(1));vec.push_back(std::make_shared<MyClass>(2));vec.push_back(std::make_shared<MyClass>(3));// 使用vector中的shared_ptrfor (const auto& ptr : vec) {ptr->print();}// 此时,MyClass对象仍然存活,因为shared_ptr仍然持有它们的引用// 当vec超出作用域并被销毁时,它的析构函数将调用每个shared_ptr的析构函数// 这将导致引用计数减少到0,并删除MyClass对象return 0;
}
shared_ptr应用场景:
大家结合自己的项目来说 (linux后端就用linux后端 音视频 嵌入式 qt 各不一样)
1.连接池当中
2.网络模块当中
3.在日志模块当中
4.在具体业务模块中
5.异步编程中延续对象的生命周期
祝大家秋招/春招顺利