std::shared_ptr 和 std::make_shared 使用详解
时间: 2023-11-16 16:44:22 浏览: 110
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 实现
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 ]
std::shared_ptr data
std::shared_ptr是C++标准库中的一个智能指针类,用于管理动态分配的资源。它具有引用计数机制,可以实现多个指针共享同一个对象的所有权。
在给std::shared_ptr赋值时,有三种方式可以使用:
1) 拷贝赋值:使用一个std::shared_ptr初始化另一个std::shared_ptr,这将导致引用计数加1。
2) 移动赋值:使用std::make_shared或者直接赋值一个临时创建的std::shared_ptr,这将导致原来的std::shared_ptr失去对资源的所有权,引用计数转移。
3) 使用std::move:将一个std::unique_ptr移动给std::shared_ptr,这将导致原来的std::unique_ptr失去对资源的所有权,引用计数转移。
对于std::shared_ptr的成员函数功能,具体可以参考STL的文档或笔记。
关于std::shared_ptr的初始化,当使用裸指针初始化std::shared_ptr时,如果指针为nullptr,则std::shared_ptr的_M_ptr和_M_refcount都将为nullptr;否则,将分配内存并初始化控制块。
所以,std::shared_ptr可以用于管理动态分配的资源,并且可以共享资源的所有权。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* [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^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"]
- *2* *3* [[STL] std::shared_ptr笔记](https://blog.csdn.net/weixin_38734472/article/details/126486549)[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^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"]
[ .reference_list ]
阅读全文