make_shared 与 shared_ptr 有什么区别?
时间: 2024-02-27 16:47:48 浏览: 50
make_shared 和 shared_ptr 都是 C++11 中引入的智能指针,它们的主要区别在于内存分配的方式不同。
shared_ptr 是通过 new 运算符分配内存,然后将指针传递给 shared_ptr 对象,从而实现智能指针的功能。而 make_shared 则是在一块内存中同时分配对象和控制块,从而避免了两次内存分配和两次指针赋值的开销,提高了程序的效率。
此外,使用 make_shared 还可以避免由于多个 shared_ptr 对象共享同一个对象而导致的内存泄漏问题。
相关问题
shared_ptr和make_shared区别
shared_ptr和make_shared是C++中用于管理动态分配对象的智能指针。
1. shared_ptr:
- shared_ptr是一个类模板,用于管理动态分配对象的引用计数。
- shared_ptr可以指向任意动态分配的对象,并且可以共享所有权。
- 通过复制shared_ptr,引用计数会增加,当引用计数为0时,会自动释放关联的对象。
- shared_ptr需要额外的内存来存储引用计数,可能会导致一定的空间开销。
2. make_shared:
- make_shared是一个函数模板,用于直接创建并初始化shared_ptr。
- make_shared可以通过传递参数来创建对象,并将返回的shared_ptr指向该对象。
- make_shared在内存中一次性分配了用于存储对象和引用计数的内存块,可以减少空间开销。
- make_shared可以避免了显式使用new操作符来分配内存。
区别:
- 内存分配方式:shared_ptr使用单独的内存块存储引用计数,而make_shared在同一内存块中同时存储对象和引用计数。
- 性能和空间开销:make_shared通常比shared_ptr更高效,因为它只需要一次内存分配,并且可以减少空间开销。
- 使用场景:一般情况下,推荐使用make_shared,除非有特殊需求,如自定义内存分配器或需要显式控制资源释放的情况下,才使用shared_ptr。
make_unique和make_shared有什么异同点?
make_unique和make_shared是C++中用于创建动态分配的智能指针的函数模板。它们的主要区别在于所管理对象的所有权和内存管理策略。
不同点:
1. 所有权:make_unique返回一个std::unique_ptr,它是独占所有权的智能指针,只能有一个指针指向对象。而make_shared返回一个std::shared_ptr,它是共享所有权的智能指针,可以有多个指针指向同一个对象。
2. 内存管理:make_unique使用new运算符在堆上分配内存,并负责释放分配的内存。make_shared使用一个控制块来管理内存,通过引用计数来跟踪指向对象的指针数量,并在不再需要时自动释放内存。
相同点:
1. 用法和语法类似,都是通过模板函数创建智能指针。
2. 都可以用于动态分配单个对象。
需要注意的是,make_shared通常比make_unique更高效,因为它可以将对象和引用计数控制块一起分配在一块连续的内存上,减少了内存分配的开销。但是,make_shared可能会导致内存占用较高,因为即使没有指针指向对象,控制块也会保持对象的内存直到最后一个指针被销毁。因此,在选择使用make_unique还是make_shared时,需要根据实际情况进行权衡。
相关推荐
![doc](https://img-home.csdnimg.cn/images/20210720083327.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)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)