std::shared_ptr 模板类型
时间: 2023-05-10 07:02:46 浏览: 66
std::shared_ptr是C++11中引入的模板类,属于智能指针的范畴。它的作用是管理堆内存对象的生命周期,可以防止内存泄漏和空悬指针的问题。共享指针通过计数器的方式来管理资源,在指针对象被创建时,计数器被设为1,当有新的共享指针指向相同的对象时,计数器会增加。如果某个指针被析构或者赋值为nullptr时,计数器减少。当计数器减为0时,智能指针会自动删除堆内存对象。
它的模板类型可以接受任意类型的指针、数组指针和自定义删除器。在传递指针时,需要确保这些对象是通过new操作符动态分配的。在传递数组指针时,需要使用std::shared_ptr<T[]>而不是std::shared_ptr<T>,因为这样能保证在析构指针时使用数组形式的delete[]操作符。
自定义删除器可以通过传递一个lambda表达式或者一个函数指针来实现。这种方式可以让用户定义如何删除所管理的对象,从而更灵活地处理指针对象。
当使用std::shared_ptr指针时,有一个需要注意的点是要避免多级指针的混乱。因为当shared_ptr对象被销毁时,它只会去删除它自己所占有的资源,而不会去删除它所指向的资源。
总的来说,使用std::shared_ptr可以有效地简化动态内存管理的代码,避免内存泄漏和空悬指针。许多与动态内存相关的问题也可以通过智能指针得到有效的解决。使用std::shared_ptr还可避免显式地释放内存,并且避免了C++中的指针操作中相关的低级语义,使得代码更清晰,可靠和易于维护。
相关问题
std::shared_ptr的使用
std::shared_ptr 是 C++11 中引入的智能指针,用于解决资源管理的问题,特别是在动态分配内存时很有用。它允许多个智能指针共享同一个对象的所有权,并在最后一个引用被销毁时自动释放内存。
要使用 std::shared_ptr,首先需要包含 <memory> 头文件。然后可以使用 std::shared_ptr 类模板来创建智能指针对象,如下所示:
```cpp
#include <memory>
int main() {
// 创建 shared_ptr 对象
std::shared_ptr<int> ptr(new int(5));
// 使用智能指针
*ptr = 10;
std::cout << *ptr << std::endl;
return 0;
}
```
在上面的示例中,我们创建了一个指向 int 类型的 shared_ptr 对象,该对象指向一个动态分配的整数 5。我们可以像使用原始指针一样使用 shared_ptr,并且当不再需要时,无需手动释放内存。
此外,shared_ptr 还可以通过复制构造函数或赋值运算符进行拷贝或赋值给其他 shared_ptr。当所有 shared_ptr 对象超出范围或显式地进行重置时,它们会自动释放它们所管理的资源。
std::shared_ptr 实现
std::shared_ptr是C++中的智能指针,用于管理动态分配的内存。它通过引用计数的方式来跟踪有多少个shared_ptr共享同一个对象。当最后一个shared_ptr离开作用域或被显式地重置时,引用计数减少并且在没有其他shared_ptr引用该对象时,内存会被自动释放。
std::shared_ptr可以通过以下几种方式进行赋值:
1. 拷贝赋值:将一个shared_ptr赋值给另一个shared_ptr,这会增加引用计数。例如,foo = bar;
2. 移动赋值:使用std::move将一个unique_ptr转移到一个shared_ptr中,这会转移所有权并且不会增加引用计数。例如,foo = std::move(unique);
3. 使用std::make_shared创建shared_ptr:std::make_shared是一个模板函数,用于在堆上创建对象并返回一个shared_ptr。它可以接受任意数量的参数,并将它们传递给对象的构造函数。例如,std::shared_ptr<int> foo = std::make_shared<int>(10);
使用shared_ptr可以避免内存泄漏和悬空指针的问题,因为它会自动管理内存的释放。同时,shared_ptr还提供了其他成员函数,如get()用于获取指向对象的原始指针,use_count()用于获取当前引用计数的值等。
总结起来,std::shared_ptr是一种智能指针,用于管理动态分配的内存。它可以通过拷贝赋值、移动赋值和std::make_shared等方式进行赋值。它的引用计数机制可以确保内存的正确释放。
#### 引用[.reference_title]
- *1* *2* [std::shared_ptr 详解](https://blog.csdn.net/baidu_31541363/article/details/95802210)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item]
- *3* [shared_ptr代码实现](https://blog.csdn.net/weixin_43246170/article/details/121339985)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item]
[ .reference_list ]