std::shared_ptr 和 std::make_shared 使用详解
时间: 2023-11-16 19:44:22 浏览: 102
std::shared_ptr 是 C++11 中引入的智能指针,它用于管理动态分配的资源。它提供了一种简单的方式来实现动态内存的分配和释放,同时避免了内存泄漏和悬挂指针的问题。
std::make_shared 是一个模板函数,用于创建 std::shared_ptr 对象。它接受任意数量的参数,并使用这些参数来构造对象。与直接使用 std::shared_ptr 的构造函数不同,std::make_shared 会在动态内存中同时分配对象和控制块,从而减少了内存开销和额外的指针。
使用 std::shared_ptr 的好处在于它可以自动管理资源的释放。当所有指向某个对象的 std::shared_ptr 都被销毁时,该对象会被自动释放。这样可以避免手动调用 delete 来释放资源,从而减少了内存泄漏的风险。
std::make_shared 的优势在于它提供了更高的性能和更少的内存开销。由于使用 std::make_shared 可以同时分配对象和控制块,因此可以减少内存碎片化的问题。此外,使用 std::make_shared 还可以避免两次内存分配的时间开销。
需要注意的是,在使用 std::shared_ptr 和 std::make_shared 时,应避免循环引用的问题。循环引用会导致资源无法被释放,从而导致内存泄漏。可以通过使用 std::weak_ptr 来解决循环引用的问题。
相关问题
std::shared_ptr<
给shared_ptr赋值有三种方式:拷贝、移动和交换。
拷贝:可以通过将一个shared_ptr赋值给另一个shared_ptr来进行拷贝。这将使得两个shared_ptr指向同一个对象,并且引用计数加1。
移动:可以使用std::make_shared函数创建一个新的shared_ptr,并将其赋值给另一个shared_ptr。这将移动对象的所有权,并且引用计数转移到新的shared_ptr。
交换:可以使用swap函数交换两个shared_ptr指向的对象。这将使得两个shared_ptr交换了所指向的对象。
例如,给定以下代码:
```
std::shared_ptr<int> foo;
std::shared_ptr<int> bar (new int(10));
foo = bar; // 拷贝,引用计数加1
bar = std::make_shared<int> (20); // 移动
```
在这个例子中,foo和bar最初都是空的shared_ptr。然后,将bar赋值给foo,这会将bar指向的对象的引用计数加1。接下来,通过使用std::make_shared函数创建一个新的shared_ptr,并将其赋值给bar,这将移动对象的所有权到新的shared_ptr。最终,foo指向的对象值为20,bar指向的对象值为10。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *2* *3* [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^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"]
[ .reference_list ]
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 ]
阅读全文