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 使用移动语义。
相关用法
- C++ Unordered_map unordered_map()用法及代码示例
- C++ Unordered_map at()用法及代码示例
- C++ Unordered_map begin()用法及代码示例
- C++ Unordered_map bucket()用法及代码示例
- C++ Unordered_map bucket_count()用法及代码示例
- C++ Unordered_map bucket_size()用法及代码示例
- C++ Unordered_map cbegin()用法及代码示例
- C++ Unordered_map cend()用法及代码示例
- C++ Unordered_map clear()用法及代码示例
- C++ Unordered_map count()用法及代码示例
- C++ Unordered_map emplace()用法及代码示例
- C++ Unordered_map emplace_hint()用法及代码示例
- C++ Unordered_map empty()用法及代码示例
- C++ Unordered_map end()用法及代码示例
- C++ Unordered_map equal()用法及代码示例
- C++ Unordered_map erase()用法及代码示例
- C++ Unordered_map find()用法及代码示例
- C++ Unordered_map get_allocator()用法及代码示例
- C++ Unordered_map hash_function()用法及代码示例
- C++ Unordered_map insert()用法及代码示例
- C++ Unordered_map key_eq()用法及代码示例
- C++ Unordered_map load_factor()用法及代码示例
- C++ Unordered_map max_bucket_count()用法及代码示例
- C++ Unordered_map max_load_factor()用法及代码示例
- C++ Unordered_map max_size()用法及代码示例
注:本文由纯净天空筛选整理自pritamauddy25大神的英文原创作品 Unique_ptr in C++。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。