shared_ptr底层
时间: 2023-10-13 19:06:03 浏览: 44
shared_ptr是C++标准库中的智能指针,用于管理动态分配的资源。它可以防止内存泄漏和悬挂指针的问题,并提供了方便的资源释放机制。
shared_ptr的底层实现主要包括以下几个部分:
1. 引用计数:shared_ptr内部维护了一个引用计数器,记录当前有多少个shared_ptr对象指向同一个资源。
2. 资源指针:shared_ptr还包含一个指针,用于指向动态分配的资源。
3. 控制块:shared_ptr还维护了一个控制块,其中保存了引用计数和其他管理信息,比如自定义的删除器等。
当一个shared_ptr对象被复制时,引用计数会增加;当一个shared_ptr对象被销毁或重置时,引用计数会减少。当引用计数为0时,表示没有任何shared_ptr对象指向该资源,此时会自动释放资源。
相关问题
如何拿到shared_ptr底层的裸指针
要获取 `shared_ptr` 底层的裸指针,可以使用 `shared_ptr` 的 `get()` 函数。该函数返回一个指向被管理对象的裸指针。
以下是一个示例代码:
```cpp
#include <iostream>
#include <memory>
int main() {
// 创建一个 shared_ptr 对象
std::shared_ptr<int> sharedPtr = std::make_shared<int>(42);
// 获取底层的裸指针
int* rawPtr = sharedPtr.get();
// 使用裸指针访问被管理的对象
std::cout << *rawPtr << std::endl;
return 0;
}
```
在上面的示例中,我们使用 `make_shared` 创建了一个 `shared_ptr` 对象来管理一个整数。然后,我们使用 `get()` 函数获取了该 `shared_ptr` 对象底层的裸指针,并通过裸指针访问了被管理的整数。
需要注意的是,当 `shared_ptr` 被销毁时,其管理的资源也会被释放。因此,在使用裸指针时要确保 `shared_ptr` 对象仍然有效。
C++智能指针shared_ptr底层结构体有哪些成员?分别有什么用?
shared_ptr是一种智能指针,用于管理动态分配的对象的生命周期。其底层结构体中主要包含以下几个成员:
1.指向所管理对象的指针成员,即"__ptr",用于存储所管理对象的地址。
2.指向所共享的引用计数的指针成员,即"__cntrl",用于存储引用计数的信息,同时也会存储一些其他信息,比如指向所使用的删除器等等。
3.存储所管理对象的类型信息的指针成员,即"type_info",用于在运行时进行类型检查。
其中,引用计数是shared_ptr最核心的部分,其主要作用是记录当前共有多少个shared_ptr对象指向同一个所管理的对象,以此来判断何时可以安全的销毁该对象。因为每次创建shared_ptr对象时,都会将引用计数加1,而每次销毁shared_ptr对象时,都会将引用计数减1,当引用计数为0时,说明没有任何shared_ptr对象指向该对象,此时可以安全地销毁该对象。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)