导航菜单

C++编程/智能指针
课程进度 85% · 第16/18章16/18章 · 标签 1/3
1

独占式智能指针

unique_ptr 独占所有权,不允许共享资源。不能复制,只能移动。

cpp
1
class Resource {
2
public:
3
Resource(const string& n) : name(n) {
4
cout << "Resource " << name << " 被创建" << endl;
5
}
6
~Resource() {
7
cout << "Resource " << name << " 被销毁" << endl;
8
}
9
void use() const {
10
cout << "Resource " << name << " 被使用" << endl;
11
}
12
private:
13
string name;
14
};
15
 
16
// unique_ptr的基本使用
17
void basic_unique_ptr() {
18
// 创建unique_ptr
19
unique_ptr<Resource> ptr1(new Resource("ptr1"));
20
 
21
// 推荐使用make_unique(C++14)
22
auto ptr2 = make_unique<Resource>("ptr2");
23
 
24
ptr1->use();
25
ptr2->use();
26
 
27
// 转移所有权
28
unique_ptr<Resource> ptr3 = move(ptr1); // ptr1现在为nullptr
29
 
30
if (ptr1 == nullptr) {
31
cout << "ptr1不再拥有资源" << endl;
32
}
33
 
34
// 释放所有权
35
ptr2.reset(); // 立即销毁资源
36
 
37
// 获取原始指针(谨慎使用)
38
Resource* raw_ptr = ptr3.get();
39
raw_ptr->use();
40
} // ptr3在这里自动销毁

📖unique_ptr 独占所有权,不能复制只能移动。支持自定义删除器,零开销抽象

2

自定义删除器

cpp
1
// 自定义删除器
2
void custom_deleter() {
3
auto deleter = [](Resource* p) {
4
cout << "使用自定义删除器" << endl;
5
delete p;
6
};
7
 
8
unique_ptr<Resource, decltype(deleter)> ptr(
9
new Resource("custom"), deleter);
10
}
11
 
12
// 管理动态数组
13
unique_ptr<int[]> arr(new int[10]);
14
arr[0] = 42;
15
 
16
// 在容器中使用
17
vector<unique_ptr<Resource>> resources;
18
resources.push_back(make_unique<Resource>("A"));
19
resources.push_back(make_unique<Resource>("B"));
20
 
21
// 注意:不能复制unique_ptr
22
// auto ptr_copy = ptr; // 错误!
23
auto ptr_move = move(ptr); // 正确