C++11&14智能指针详解:std::shared_ptr与std::weak_ptr
89 浏览量
更新于2024-08-30
1
收藏 76KB PDF 举报
"C++11和C++14引入了智能指针,作为解决C++动态内存管理问题的一种机制,类似于Java的垃圾回收机制。智能指针通过对象来管理资源指针,并使用计数器跟踪引用数量,当最后一个管理对象销毁时,自动释放内存。本文主要讨论两种常见的智能指针:std::shared_ptr和std::weak_ptr。"
在C++中,动态内存管理是一个关键但又容易出错的部分。传统的裸指针(如`new`分配的内存)需要程序员手动管理内存释放,如果忘记或者管理不当,可能会导致内存泄漏或悬挂指针。为了解决这个问题,C++11引入了智能指针,其中最重要的两种是`std::shared_ptr`和`std::weak_ptr`。
1. `std::shared_ptr`
`std::shared_ptr`是C++标准库中的一个智能指针,它跟踪指向的对象的引用计数。每当创建一个新的`std::shared_ptr`实例来共享同一对象时,引用计数会增加;当`std::shared_ptr`实例被销毁或赋值给其他指针时,引用计数会减少。当引用计数变为零时,`std::shared_ptr`会自动调用`delete`来释放内存。这确保了即使在复杂的所有权结构中,内存也能被正确地管理。
以下是一个`std::shared_ptr`的使用示例:
```cpp
#include <memory>
#include <iostream>
class Test {
public:
Test() { std::cout << "Test()" << std::endl; }
~Test() { std::cout << "~Test()" << std::endl; }
};
int main() {
std::shared_ptr<Test> p1 = std::make_shared<Test>();
std::cout << "1ref: " << p1.use_count() << std::endl;
{
std::shared_ptr<Test> p2 = p1;
std::cout << "2ref: " << p1.use_count() << std::endl;
}
std::cout << "3ref: " << p1.use_count() << std::endl;
return 0;
}
```
在这个例子中,`std::make_shared`用于创建一个`Test`对象并返回一个`std::shared_ptr`。`use_count()`方法用于查询引用计数。当创建`p2`时,`p1`的引用计数增加到2,然后在`p2`离开作用域时减少回1。当`p1`离开作用域时,`~Test()`被调用,表明对象已被删除。
2. `std::weak_ptr`
`std::weak_ptr`是一种弱引用智能指针,它不增加对象的引用计数。它的设计目的是避免循环引用问题,即两个`std::shared_ptr`互相引用,导致它们的引用计数永远不会降为零,从而无法释放内存。`std::weak_ptr`可以观察`std::shared_ptr`所管理的对象,但不会拥有它。只有当`std::shared_ptr`仍然存在时,`std::weak_ptr`才能访问对象。如果所有`std::shared_ptr`实例都已销毁,`std::weak_ptr`尝试访问对象会失败。
使用`std::weak_ptr`的一个常见场景是实现观察者模式,其中观察者不应阻止被观察者被销毁。
```cpp
std::weak_ptr<Test> wp1;
std::shared_ptr<Test> sp1 = std::make_shared<Test>();
wp1 = sp1;
if (std::shared_ptr<Test> sp2 = wp1.lock()) {
// 使用sp2访问对象
} else {
// 对象已被销毁,无法访问
}
```
在这个例子中,`wp1`是一个弱引用,不能直接访问`Test`对象。使用`lock()`方法可以检查对象是否还存在,并在存在时返回一个临时的`std::shared_ptr`。
通过使用智能指针,C++程序员可以更安全地管理动态内存,降低内存泄漏和悬挂指针的风险。`std::shared_ptr`和`std::weak_ptr`提供了强大且灵活的工具,帮助构建健壮的、无内存问题的C++程序。
2018-09-29 上传
2014-06-01 上传
2008-11-06 上传
101 浏览量
2021-10-08 上传
2019-12-18 上传
2009-01-07 上传
点击了解资源详情
weixin_38648037
- 粉丝: 0
- 资源: 929
最新资源
- Chrome ESLint扩展:实时运行ESLint于网页脚本
- 基于 Webhook 的 redux 预处理器实现教程
- 探索国际CMS内容管理系统v1.1的新功能与应用
- 在Heroku上快速部署Directus平台的指南
- Folks Who Code官网:打造安全友好的开源环境
- React测试专用:上下文提供者组件实现指南
- RabbitMQ利用eLevelDB后端实现高效消息索引
- JavaScript双向对象引用的极简实现教程
- Bazel 0.18.1版本发布,Windows平台构建工具优化
- electron-notification-desktop:电子应用桌面通知解决方案
- 天津理工操作系统实验报告:进程与存储器管理
- 掌握webpack动态热模块替换的实现技巧
- 恶意软件ep_kaput: Etherpad插件系统破坏者
- Java实现Opus音频解码器jopus库的应用与介绍
- QString库:C语言中的高效动态字符串处理
- 微信小程序图像识别与AI功能实现源码