std::unique_ptr构造
时间: 2023-11-07 13:47:54 浏览: 50
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 是 C++11 标准库中的智能指针,用于管理动态分配的对象。它的主要特点是独占式拥有权(Ownership),即同一时间只能有一个 std::unique_ptr 指向一个对象,保证了对象的唯一性和安全性。
std::unique_ptr 的声明方式如下:
```c++
template<class T, class Deleter = std::default_delete<T>>
class unique_ptr;
```
其中,T 表示指向的对象类型,Deleter 表示对象销毁时的自定义函数对象类型,默认使用 std::default_delete<T>。
使用 std::unique_ptr 创建对象的步骤如下:
1. 使用 new 运算符分配一个动态对象;
2. 将指向动态对象的指针传递给 std::unique_ptr 的构造函数,创建 std::unique_ptr 对象;
3. 使用 std::unique_ptr 对象操作动态对象;
4. 当 std::unique_ptr 对象超出作用域或被销毁时,会自动调用其析构函数,自动删除动态对象。
例如:
```c++
std::unique_ptr<int> ptr(new int(42));
std::cout << *ptr << std::endl;
```
上面的代码中,使用 new 运算符分配一个 int 类型的动态对象,并通过 std::unique_ptr 构造函数将其封装成智能指针,最后使用 *ptr 取出动态对象的值并输出。
需要注意的是,std::unique_ptr 对象不能被复制或赋值,只能通过 std::move() 函数来转移所有权。例如:
```c++
std::unique_ptr<int> ptr(new int(42));
// 错误:std::unique_ptr 对象不能被复制或赋值
// std::unique_ptr<int> ptr2 = ptr;
// 转移所有权
std::unique_ptr<int> ptr2 = std::move(ptr);
// 输出 42
std::cout << *ptr2 << std::endl;
```
上面的代码中,尝试将 std::unique_ptr 对象 ptr 复制或赋值给 ptr2 时会编译错误,只能使用 std::move() 函数将所有权转移给 ptr2,最后输出动态对象的值。
定义一个模板std::unique_ptr
std::unique_ptr是C++11引入的智能指针,用于管理动态分配的对象。它提供了独占所有权的语义,即同一时间只能有一个unique_ptr指向一个对象。
定义一个std::unique_ptr的模板可以使用以下语法:
```cpp
std::unique_ptr<T> ptr;
```
其中,T是指向的对象的类型。通过这种方式定义的unique_ptr默认为空指针,不指向任何对象。
可以使用new关键字来创建一个对象,并将其分配给unique_ptr:
```cpp
std::unique_ptr<T> ptr(new T);
```
这样,unique_ptr就拥有了对该对象的所有权。当unique_ptr超出作用域或被显式释放时,它会自动调用delete来释放所管理的对象。
此外,还可以使用make_unique函数来创建一个unique_ptr,并自动分配和构造对象:
```cpp
std::unique_ptr<T> ptr = std::make_unique<T>(args);
```
这种方式更加安全,因为它可以避免显式使用new和delete,从而减少内存泄漏和资源泄漏的风险。