std::make_shared或std::make_unique 为什么代替了new
时间: 2023-11-16 11:15:56 浏览: 136
在编写C++代码时,通常使用`new`来动态分配内存并创建对象。然而,使用`new`会产生一些问题,特别是在处理异常时。这可能导致资源泄漏和内存泄漏的风险。为了解决这个问题,C++引入了`std::make_shared`和`std::make_unique`函数来代替`new`操作。
`std::make_shared`是C++11标准的一部分,它接受参数并返回一个指向动态分配的对象的`std::shared_ptr`指针。它的优势在于,它将对象和引用计数的控制均封装在一个内部的控制块中,从而提供了更高效的内存管理。此外,`std::make_shared`还可以避免显式使用`delete`操作符来释放内存,因为当最后一个`std::shared_ptr`指针离开作用域时,会自动释放对象。
`std::make_unique`是C++14标准的一部分,它类似于`std::make_shared`,但返回的是一个指向动态分配的对象的`std::unique_ptr`指针。与`std::make_shared`相比,`std::make_unique`只有一个指针来管理对象,因此内存开销更小。此外,`std::make_unique`还提供了更好的异常安全性,因为它使用了移动语义,可以确保在异常发生时自动释放内存。
因此,使用`std::make_shared`或`std::make_unique`代替`new`能够提供更好的内存管理和异常安全性,从而减少资源泄漏和内存泄漏的风险。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *3* [条款21:优先考虑使用std::make_unique和std::make_shared,而非直接使用new](https://blog.csdn.net/u012069234/article/details/129644837)[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* [std::make_unique和std::make_shared<T>](https://blog.csdn.net/zgaoq/article/details/117563403)[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 ]
阅读全文