make_shared和new
时间: 2023-08-03 15:13:53 浏览: 59
`make_shared` 和 `new` 都是 C++ 中用于动态分配内存的函数。
`new` 用于分配单个对象的内存,并返回指向该对象的指针。使用 `new` 分配的内存需要手动释放,否则可能会导致内存泄漏。
例如,下面的代码使用 `new` 分配一个 `int` 类型的对象,并将其赋值为 `42`:
```
int* myInt = new int(42);
```
`make_shared` 用于创建一个 `std::shared_ptr` 对象,该对象可以自动地管理动态分配的内存。使用 `make_shared` 分配的内存会在引用计数变为零时自动释放。
例如,下面的代码使用 `make_shared` 分配一个 `int` 类型的对象,并将其赋值为 `42`:
```
std::shared_ptr<int> myInt = std::make_shared<int>(42);
```
总体而言,使用 `make_shared` 更加安全、高效,因为它可以避免手动释放内存和多次分配内存的开销。但是,`new` 仍然有其用处,例如在分配数组时。
相关问题
make_shared和new的区别
make_shared和new在分配和初始化动态内存时有一些区别。
make_shared在动态内存中分配一个对象并初始化它,返回指向此对象的shared_ptr。它可以通过传递参数给构造函数来初始化对象。make_shared定义在头文件memory中。它的优点是可以减少内存分配和对象构造的次数,提高性能。同时,make_shared还可以自动销毁对象并释放内存,无需手动管理。
而new则是用于在动态内存中分配一个对象,并返回指向该对象的指针。使用new需要手动管理内存,包括手动析构对象和释放内存。它需要使用delete或delete[]来释放对象和内存。new可以用于分配单个对象,也可以用于分配数组。但是new分配的内存可能会导致内存碎片产生。
总结来说,make_shared可以简化动态内存分配和对象初始化的过程,并且自动管理内存的释放。而new需要手动管理内存,并且可能导致内存碎片的产生。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* [shared-ptr(智能指针)举例.pdf](https://download.csdn.net/download/qq_43934844/87504633)[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_2"}}] [.reference_item style="max-width: 33.333333333333336%"]
- *2* [[modern c++] std::make_shared 和 std::shared(new)的区别](https://blog.csdn.net/ykun089/article/details/121787439)[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_2"}}] [.reference_item style="max-width: 33.333333333333336%"]
- *3* [new 和 make_shared 在内存上的区别](https://blog.csdn.net/anna2117/article/details/101802846)[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_2"}}] [.reference_item style="max-width: 33.333333333333336%"]
[ .reference_list ]
std::make_shared和new
std::make_shared和new都是用于动态分配内存的方法,但它们有一些不同之处。
1. 使用方式:
- 使用new时,你需要手动管理内存的生命周期。需要在不再使用对象时使用delete来释放内存。
- 使用std::make_shared时,返回一个std::shared_ptr对象,它会自动管理内存的生命周期。当没有引用指向该对象时,内存会被自动释放。
2. 内存分配方式:
- new直接分配所需的内存空间,并返回一个指向该内存的指针。
- std::make_shared分配一个更大的内存块,用于存储对象及其控制块信息(引用计数等)。返回一个指向该内存块的std::shared_ptr。
3. 性能:
- std::make_shared通常比new具有更好的性能,因为它只需要一次内存分配,并且可以在该内存上共享控制块。
- new在每次对象创建时都需要进行内存分配。
综上所述,如果你需要动态分配一个对象,并且希望自动管理其生命周期,则推荐使用std::make_shared。如果你需要更精细地控制内存的生命周期或者需要在不同的地方共享指针,则可以使用new。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_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)