std::unique_ptr的初始化
时间: 2024-10-11 08:16:13 浏览: 37
`std::unique_ptr` 是C++标准库中的智能指针,用于管理动态分配的对象生命周期。它的初始化主要有两种情况:
1. **使用`std::make_unique`**[^1]:
```cpp
std::unique_ptr<int> ptr1 = std::make_unique<int>(10); // 创建并立即拥有一个整数对象,其值为10
```
`std::make_unique`会自动调用适当的构造函数来创建新的对象。
2. **从已存在的`unique_ptr`转移所有权**:
```cpp
std::unique_ptr<int> ptr1 = std::make_unique<int>(10);
std::unique_ptr<int> ptr2 = std::move(ptr1); // 使用移动构造,将ptr1的所有权转移到ptr2
```
这里,`std::move`实际上是将`ptr1`的资源所有权交给`ptr2`,而`ptr1`则变为无意义的空指针。
需要注意的是,由于`std::unique_ptr`的设计,它不允许简单地复制构造(即`std::unique_ptr ptr2 = ptr1;`),以防止所有权的意外共享。
相关问题
static std::unique_ptr<uint8_t[]> new_extradata;如何初始化
在 C++11 中,你可以使用以下方式初始化 `std::unique_ptr`:
1. 使用 `new` 运算符手动分配内存,并将返回的指针传递给 `std::unique_ptr` 的构造函数:
```cpp
static std::unique_ptr<uint8_t[]> new_extradata(new uint8_t[1024]);
```
这里我们手动分配了 1024 字节的内存,并将返回的指针传递给 `new_extradata` 的构造函数,使得 `new_extradata` 管理这段内存。需要注意的是,`std::unique_ptr` 会默认使用 `delete[]` 来释放数组类型的内存,因此不需要指定删除器。
2. 使用 `std::make_unique` 函数:
```cpp
static auto new_extradata = std::make_unique<uint8_t[]>(1024);
```
这里我们使用 `std::make_unique` 函数来创建一个 `std::unique_ptr` 对象,并初始化为一个 `uint8_t` 类型的数组。需要注意的是,这里需要指定数组的大小,即 `1024`。
std::unique_ptr和std::shared_ptr怎么使用
`std::unique_ptr` 和 `std::shared_ptr` 是C++11标准库中提供的两个智能指针,用于替代原始的指针,以简化内存管理并防止资源泄露。它们分别代表独占所有权(exclusive ownership)和共享所有权(shared ownership)的概念。
### 1. std::unique_ptr
- **独占所有权**:`std::unique_ptr` 指向的对象有且仅有一个拥有者,当拥有者离开作用域时,它会自动调用析构函数释放内存。
- **创建和使用**:
```cpp
std::unique_ptr<int> ptr(new int(5)); // 创建并初始化一个整型对象
ptr = nullptr; // 移除所有权,对象会被销毁
```
- **优点**:
- 避免了忘记删除动态分配的内存的风险。
- 单线程场景中性能较好,因为没有额外的引用计数。
### 2. std::shared_ptr
- **共享所有权**:`std::shared_ptr` 可以有多个所有者,每个所有者都有权调用析构函数。内部维护一个引用计数,当最后一个所有者消失时,才会释放内存。
- **创建和使用**:
```cpp
std::shared_ptr<int> ptr1(new int(5)), ptr2(ptr1); // 创建共享所有权
ptr1.reset(); // 将ptr1的所有权转移给NULL,但仍保留ptr2的引用
```
- **优点**:
- 支持多线程环境下的安全共享。
- 自动垃圾回收,适合于大量对象的生命周期不确定的情况。
阅读全文