make_unique用法
时间: 2023-07-29 08:12:22 浏览: 148
`std::make_unique` 是 C++11 标准引入的一个函数模板,用于在堆上创建一个动态分配的对象,并返回指向该对象的唯一指针。`std::make_unique` 的语法如下:
```c++
template <typename T, typename... Args>
std::unique_ptr<T> make_unique(Args&&... args);
```
其中,`T` 表示要创建的对象类型,`Args` 表示要传递给对象构造函数的参数类型。`std::make_unique` 的第一个参数是要创建的对象类型,后面的参数是传递给对象构造函数的参数。
使用 `std::make_unique` 创建对象的好处是,它可以避免手动管理内存,同时可以保证在出现异常时自动释放已分配的内存。例如:
```c++
#include <memory>
int main() {
auto p = std::make_unique<int>(42);
return 0;
}
```
这里我们使用 `std::make_unique` 创建了一个 `int` 类型的对象并初始化为 `42`,并将其赋值给 `p`,`p` 是一个 `std::unique_ptr<int>` 类型的智能指针,它会在作用域结束时自动释放内存,无需手动 `delete`。
相关问题
std::make_unique用法详解
std::make_unique 是 C++14 中引入的一个函数模板,用于创建一个动态分配的对象,并返回一个 std::unique_ptr 智能指针,该指针拥有对该对象的唯一所有权。它的语法如下:
```c++
template< class T, class... Args >
std::unique_ptr<T> make_unique( Args&&... args );```
其中,T 是要创建的对象类型,Args 是传递给 T 构造函数的参数列表。
使用 std::make_unique 的好处是可以避免手动管理 new 和 delete 操作,从而避免内存泄漏和空悬指针等问题。此外,std::make_unique 还可以提高代码的可读性和安全性。
例如,我们可以使用 std::make_unique 创建一个动态分配的 int 对象:
```c++
auto p = std::make_unique<int>(42);
```
这里,p 是一个 std::unique_ptr<int> 智能指针,它拥有对动态分配的 int 对象的唯一所有权,并且该对象的值为 42。
需要注意的是,std::make_unique 只能用于创建动态分配的对象,不能用于创建静态对象或数组。
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时,需要根据实际情况进行权衡。
阅读全文