当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


C++ Unique_ptr用法及代码示例


std::unique_ptr 是 C++11 中引入的智能指针。它自动管理堆上动态分配的资源。智能指针只是常规旧指针的包装,可以帮助您防止广泛的错误。即忘记删除指针而导致内存泄漏,或者意外删除指针两次或以错误的方式删除指针。它们的使用方式与标准指针类似。他们将一些导致常见错误的手动流程自动化。

先决条件: C++中的指针,C++ 中的智能指针。

用法

unique_ptr<A> ptr1 (new A)

这里,

  • unique_ptr<A>:它指定 std::unique_ptr 的类型。在本例中 - 类型 A 的对象。
  • 新A:使用 new 运算符在堆上动态分配 A 类型的对象。
  • 指针1:这是 std::unique_ptr 变量的名称。

使用unique_ptr 时会发生什么?

当我们写入 unique_ptr<A> ptr1 (new A) 时,会在堆上为数据类型 A 的实例分配内存。 ptr1 被初始化并指向新创建的 A 对象。在这里,ptr1 是新创建的对象 A 的唯一所有者,它管理该对象的生命周期。这意味着当 ptr1 被重置或超出范围时,内存将自动释放并且 A 的对象被销毁。

何时使用unique_ptr?

当需要资源所有权时。当我们想要资源的单一或独占所有权时,我们应该选择唯一的指针。只有一个唯一的指针可以指向一种资源。因此,一个唯一的指针不能复制到另一个。此外,当动态分配的对象超出范围时,它有助于自动清理,并有助于防止内存泄漏。

Note: We need to use the <memory> header file for using these smart pointers.

Unique_ptr 的示例

示例 1:

让我们创建一个结构体 A,它将有一个名为 printA 的方法来显示一些文本。然后在主部分中,让我们创建一个指向结构体 A 的唯一指针。因此,此时,我们有一个结构体 A 的实例,并且 p1 保存指向该实例的指针。

C++


// C++ Program to implement unique_ptr 
#include <iostream> 
#include <memory> 
using namespace std; 
  
struct A { 
    void printA() { cout << "A struct...." << endl; } 
}; 
  
int main() 
{ 
    unique_ptr<A> p1(new A); 
    p1->printA(); 
  
    // displays address of the containing pointer 
    cout << p1.get() << endl; 
    return 0; 
}
输出
A struct....
0x18dac20



示例 2

现在让我们创建另一个指针 p2,并尝试使用赋值运算符 (=) 复制指针 p1。

C++


// C++ Program to implement unique_ptr 
#include <iostream> 
#include <memory> 
using namespace std; 
  
struct A { 
    void printA() { cout << "A struct...." << endl; } 
}; 
int main() 
{ 
    unique_ptr<A> p1(new A); 
    p1->printA(); 
  
    // displays address of the containing pointer 
    cout << p1.get() << endl; 
  
    // will give compile time error 
    unique_ptr<A> p2 = p1; 
    p2->printA(); 
    return 0; 
}

输出

main.cpp: In function ‘int main()’:
main.cpp:18:24: error: use of deleted function ‘std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = A; _Dp = std::default_delete]’
18 | unique_ptr<A> p2 = p1;
| ^~
In file included from /usr/include/c++/11/memory:76,
from main.cpp:3:
/usr/include/c++/11/bits/unique_ptr.h:468:7: note: declared here
468 | unique_ptr(const unique_ptr&) = delete;
| ^~~~~~~~~~

上面的代码将给出编译时错误,因为在唯一指针的情况下我们无法将指针 p2 分配给 p1。我们必须使用移动语义来达到这样的目的,如下所示。

实施例3

使用移动语义管理类型 A 的对象。

C++


// C++ Program to implement unique_ptr 
#include <iostream> 
#include <memory> 
using namespace std; 
  
struct A { 
    void printA() { cout << "A struct...." << endl; } 
}; 
int main() 
{ 
    unique_ptr<A> p1(new A); 
    p1->printA(); 
    
    // displays address of the containing pointer 
    cout << p1.get() << endl; 
  
    // now address stored in p1 shpould get copied to p2 
    unique_ptr<A> p2 = move(p1); 
  
    p2->printA(); 
    cout << p1.get() << endl; 
    cout << p2.get() << endl; 
    return 0; 
}
输出
A struct....
0x2018c20
A struct....
0
0x2018c20



注意,一旦指针 p1 中的地址复制到指针 p2 中,指针 p1 的地址将变为 NULL(0),并且 p2 存储的地址现在与 p1 存储的地址相同,表明 p1 中的地址已转移到指针p2 使用移动语义。



相关用法


注:本文由纯净天空筛选整理自pritamauddy25大神的英文原创作品 Unique_ptr in C++。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。