C++d unique_ptr 中的make_unique
时间: 2023-09-13 19:08:00 浏览: 107
在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`对象有几个优点,其中之一是避免了显式指定删除器的需要(即使用自定义的删除函数)。此外,由于它是一个函数模板,可以根据所需的类型自动推断参数,从而减少了代码的重复性和错误的可能性。
相关问题
什么是C++的unique_ptr shared_ptr weak_ptr
在C++中,`unique_ptr`、`shared_ptr`、`weak_ptr`是三种常用的智能指针,用于管理动态分配的内存,避免内存泄漏和悬空指针等问题。
1. `unique_ptr`:是一种独占式智能指针,表示一个对象的所有权只能被一个`unique_ptr`持有,不能被其他指针或引用所共享。当`unique_ptr`超出作用域或被显式释放时,它所指向的对象将被自动销毁。例如:
```cpp
std::unique_ptr<int> p(new int(10));
```
2. `shared_ptr`:是一种共享式智能指针,表示一个对象的所有权可以被多个`shared_ptr`共享。每个`shared_ptr`维护一个引用计数器,当引用计数器变为0时,它所指向的对象将被自动销毁。`shared_ptr`还支持自定义删除器,可以在对象销毁时执行特定的操作。例如:
```cpp
std::shared_ptr<int> p = std::make_shared<int>(10);
std::shared_ptr<int> q = p;
```
3. `weak_ptr`:是一种弱引用智能指针,不能直接访问所指向的对象,只能通过调用`lock()`方法获得一个指向所指对象的`shared_ptr`。当`weak_ptr`所指向的对象已经被销毁时,`lock()`方法将返回一个空的`shared_ptr`。`weak_ptr`主要用于解决`shared_ptr`的循环引用问题,避免内存泄漏。例如:
```cpp
std::shared_ptr<int> p = std::make_shared<int>(10);
std::weak_ptr<int> q = p;
std::shared_ptr<int> r = q.lock();
```
这些智能指针都定义在`<memory>`头文件中,并且都是模板类,可以用于管理各种类型的动态分配内存。在实际开发中,应尽量使用智能指针来管理内存,避免手动管理内存所带来的麻烦和风险。
使用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对象超出作用域时,会自动释放它所拥有的内存。同时,由于我们使用了动态分配的数组,我们可以在运行时确定数组的大小,这使得我们的程序更加灵活。
阅读全文