C++ 标准库 智能指针
C++没有垃圾回收,因此 new 出来的对象都要自己管理
为了方便的管理内存,我们发现垃圾回收中引用计数的思路很简单就能在 C++中实现,而其实标准库中就已经有这样的实现,也就是智能指针
它们的头文件都是 memory
shared_prt
根据引用计数自动销毁对象,构造时引用数加一,析构时引用数减一,为零就销毁
void Func(shared_ptr<string> ptr) {
printf("%ld\n", ptr.use_count());
auto ptr2 = ptr;
printf("%ld\n", ptr.use_count());
}
int main() {
auto ptr = make_shared<string>("Hello shared ptr");
printf("%ld\n", ptr.use_count());
Func(ptr);
printf("%ld\n", ptr.use_count());
return 0;
}
weak_ptr
有时候我们希望获得一个使用 shared_ptr 管理的对象,但是又不希望影响原本 shared_ptr 的生命期,此时就可以使用 weak_ptr
它不会改变引用计数,可以查询是否被销毁,另外也可以调用 lock 方法来获取 shared_ptr 续命
把上面的例子修改一下
void Func(weak_ptr<string> ptr) {
printf("%ld\n", ptr.use_count());
auto ptr2 = ptr.lock();
printf("%ld\n", ptr.use_count());
}
int main() {
auto ptr = make_shared<string>("Hello shared ptr");
printf("%ld\n", ptr.use_count());
Func(ptr);
printf("%ld\n", ptr.use_count());
return 0;
}
unique_ptr
可以理解为特殊的 shared_ptr,它的引用数至多为一,拷贝构造函数也被禁用
如果想要转移一个使用 unique_ptr 管理的对象,需要 move
int main() {
auto ptr = make_unique<string>("Hello shared ptr");
printf("%s\n", ptr->c_str());
auto ptr2 = move(ptr);
printf("%s\n", ptr2->c_str());
return 0;
}
分类:
language: C++
标签:
CXX 11
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· 分享4款.NET开源、免费、实用的商城系统
· 解决跨域问题的这6种方案,真香!
· 一套基于 Material Design 规范实现的 Blazor 和 Razor 通用组件库
· 5. Nginx 负载均衡配置案例(附有详细截图说明++)
2021-11-10 Visual Studio 2022 激活码
2020-11-10 树的直径 | 简答的两道模板题
2020-11-10 Codeforces Round #544 (Div. 3)简单题解