std::unique_ptr的初始化
时间: 2024-10-11 16:16:13 浏览: 12
`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;`),以防止所有权的意外共享。
相关问题
std::unique_ptr构造
std::unique_ptr构造函数有多种常用的方式。其中一种是通过直接使用指针初始化,例如:std::unique_ptr<int> p(new int(5)); 这样会创建一个指向int类型的智能指针p,它指向一个值为5的int对象。另一种方式是使用std::make_unique函数,例如:auto q = std::make_unique<int>(10); 这样会创建一个指向int类型的智能指针q,它指向一个值为10的int对象。还有一种方式是使用std::move函数转移指针的所有权,例如:std::unique_ptr<int> r = std::move(p); 这样会将指针p的所有权转移给指针r,使得r指向原来p所指的对象。这样做后,p指针将变为无效的。总之,std::unique_ptr提供了多种灵活的构造方式,以适应不同的使用场景。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
std::unique_ptr使用示例
当使用std::unique_ptr时,您可以按照以下示例来初始化和使用它:
```cpp
#include <iostream>
#include <memory>
class MyClass {
public:
MyClass() {
std::cout << "MyClass created." << std::endl;
}
~MyClass() {
std::cout << "MyClass destroyed." << std::endl;
}
void doSomething() {
std::cout << "Doing something." << std::endl;
}
};
int main() {
// 初始化一个std::unique_ptr
std::unique_ptr<MyClass> ptr(new MyClass());
// 使用箭头运算符来调用成员函数
ptr->doSomething();
// 当指针超出范围时,std::unique_ptr会自动释放内存
return 0;
}
```
在上面的示例中,我们首先创建了一个名为MyClass的类。然后,在main函数中,我们使用std::unique_ptr来初始化一个指向MyClass对象的指针。当我们使用箭头运算符(->)来调用成员函数doSomething时,它会输出"Doing something."。在程序结束时,由于std::unique_ptr的析构函数会自动释放内存,所以输出会显示"MyClass destroyed."。
阅读全文