make_unique 和 unique_ptr
时间: 2023-09-15 08:15:19 浏览: 118
make_unique 是一个 C++14 中的函数模板,用于创建独占所有权的智能指针 unique_ptr 对象。它的使用方式类似于 std::make_shared,但是它创建的是 unique_ptr 而不是 shared_ptr。
unique_ptr 是 C++11 中引入的一个智能指针,它可以自动管理资源的释放,并且只能有一个 unique_ptr 指向同一个对象。当 unique_ptr 被销毁时,它的析构函数会自动释放它所指向的对象。
使用 make_unique 可以避免手动创建 unique_ptr 对象,并且可以避免内存泄漏等问题。例如:
```
auto ptr = std::make_unique<int>(42);
```
这样就创建了一个独占所有权的智能指针 unique_ptr<int>,它指向一个值为 42 的 int 对象。
需要注意的是,make_unique 目前只在 C++14 中可用,如果编译器不支持 C++14,可以使用类似于下面的代码来创建 unique_ptr 对象:
```
std::unique_ptr<int> ptr(new int(42));
```
相关问题
使用unique_ptr和make_unique写一个例子
下面是一个使用unique_ptr和make_unique的简单例子,用于管理动态分配的整型数组:
```c++
#include <iostream>
#include <memory>
int main() {
// 使用make_unique创建一个unique_ptr对象,初始化为指向大小为5的整型数组
std::unique_ptr<int[]> arr = std::make_unique<int[]>(5);
// 对数组进行赋值
for (int i = 0; i < 5; i++) {
arr[i] = i;
}
// 输出数组内容
for (int i = 0; i < 5; i++) {
std::cout << arr[i] << " ";
}
std::cout << std::endl;
return 0;
}
```
在这个例子中,我们使用make_unique函数创建了一个unique_ptr对象,该对象指向了一个大小为5的整型数组。由于我们使用了unique_ptr,我们不需要手动释放数组空间,当unique_ptr对象超出作用域时,会自动释放它所拥有的内存。同时,由于我们使用了动态分配的数组,我们可以在运行时确定数组的大小,这使得我们的程序更加灵活。
C++d unique_ptr 中的make_unique
在C++中,`std::make_unique`是一个函数模板,用于创建一个`std::unique_ptr`对象并初始化它。`std::unique_ptr`是一种智能指针,用于管理动态分配的对象的生命周期。
`std::make_unique`函数模板接受一个可变数量的参数,并返回一个已初始化的`std::unique_ptr`对象。它会自动推断要分配的对象的类型,并使用传递的参数来初始化该对象。
这是一个使用`std::make_unique`创建`std::unique_ptr`的示例:
```cpp
#include <memory>
int main() {
auto ptr = std::make_unique<int>(42);
return 0;
}
```
在上面的例子中,我们使用`std::make_unique`创建了一个指向整数的`std::unique_ptr`,并将其初始化为42。当离开`main`函数时,由于`std::unique_ptr`的析构函数会自动释放所指向的内存,所以不需要手动释放内存。
使用`std::make_unique`相比直接使用`new`操作符来创建`std::unique_ptr`对象有几个优点,其中之一是避免了显式指定删除器的需要(即使用自定义的删除函数)。此外,由于它是一个函数模板,可以根据所需的类型自动推断参数,从而减少了代码的重复性和错误的可能性。