
C++ 标准库读书杂记7 Smart Pointer
丢忘释放内存,导致内存泄漏。 在异常发生时, 原本的 目标的 目标的指针指向源的指针。
发布日期:2021-05-10 05:00:41
浏览次数:26
分类:精选文章
本文共 2003 字,大约阅读时间需要 6 分钟。
C++没有内存回收机制,因此程序员在使用new
创建对象时,必须手动使用delete
释放内存。如果操作复杂,可能会遗漏delete
,导致内存泄漏。为了简化内存管理,C++引入了智能指针(Smart Pointers),用于管理动态资源。
raw指针的局限性
使用raw pointer
管理动态内存时,常见问题包括:
delete
操作无法执行,同样引发内存泄漏。智能指针类型
智能指针主要有三种:shared_ptr
、unique_ptr
和weak_ptr
。shared_ptr
是最常用的,且其他人版本(如unique_ptr
和weak_ptr
)可以协同工作。
shared_ptr
shared_ptr
采用引用计数机制。多个shared_ptr
指向同一内存区域,它们共同维护一个引用计数器。当引用次数为0时,才释放内存。
注意事项
- 循环引用:如果一个
shared_ptr
指向另一个shared_ptr
,而被引用的对象没有shared_ptr
释放该指针的话,就可能导致内存泄漏。weak_ptr
适用于这种情况。 - 构造与析构函数:
- 默认构造函数:
shared_ptr()
,无引用计数。 - 初始化构造函数:接受一个
T*
指针或另一个shared_ptr
。 - 析构函数会先检查引用计数器是否为0,若是则删除指针和引用计数器。
- 默认构造函数:
赋值运算
当将shared_ptr<T>
对象赋值给另一个shared_ptr<T>
对象时,会进行以下操作:
refCount
自减。refCount
自加。member functions
shared_ptr
提供丰富的功能:
construct
:创建shared_ptr
。destroy
:释放内存。operator=
:赋值。swap
:交换两个shared_ptr
。reset
:重置指针。get
:获取指针。operator*
和operator->
:访问对象。use_count
:获取引用计数。unique
:检查是否为唯一拥有者。operator bool
:检查是否不为空。owner_before
:检查是否在资源恢复顺序中的位置。lock
:获取可移动的shared_ptr
。
示例
#include "shared_ptr.h"class Foo {public: Foo() { std::cout << "Foo...\n"; } ~Foo() { std::cout << "~Foo...\n"; }};// 接受foo_的函数void func_shared_ptr(const shared_ptr& foo_) { std::cout << "foo_.use_count = " << foo_.use_count() << '\n';}
unique_ptr
unique_ptr
不共享指针,资源所有权只能通过移动转移。由于禁止复制,非常适合当内存资源由一个所有者管理时使用。移动操作提供了一种转移内存所有权的方式,可以避免复杂的资源管理。
特点
- 不能拷贝或赋值,除非使用
std::move
。 - 创建方式:传递
new
返回的指针给unique_ptr
的构造函数。 - 拷贝构造函数不存在,普通拷贝操作会报错。
- 移动操作允许资源转移。
示例
// 创建unique_ptrunique_ptr pInt(new int(5));// 挾有资源的对象对象A pIntOwner(pInt);// 通过std::move转移资源所有权unique_ptr pIntMove(std::move(pInt));
weak_ptr
weak_ptr
是shared_ptr
的弱引用,用于临时引用对象。当对象被释放时,weak_ptr
也会失效。它特别适用于避免循环引用和临时引用对象。
特点
weak_ptr
不控制对象生命周期。- 当对象被释放时,
weak_ptr
失效。 - 必须通过
lock()
获取可无效的shared_ptr
才能使用。
示例
// 创建weak_ptrweak_ptr gw;void f() { auto spt = gw.lock(); if (spt) { // 通过spt访问对象 } else { // gw已经失效 }}
总结
智能指针通过引用计数和移动机制,简化了动态内存管理。shared_ptr
适合一般场景,unique_ptr
适用于单所有者资源管理,weak_ptr
用于临时引用或循环引用场景。选择合适的智能指针类型,可以提高代码的安全性和可维护性。
发表评论
最新留言
很好
[***.229.124.182]2025年04月28日 10时58分26秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
面试题 08.01. 三步问题
2019-03-15
剑指 Offer 11. 旋转数组的最小数字
2019-03-15
剑指 Offer 57. 和为s的两个数字
2019-03-15
git 在本地删除、添加远端的源
2019-03-15
字符串的反转
2019-03-15
docker用法
2019-03-15
word文档注入(追踪word文档)未完
2019-03-15
作为我的第一篇csdn博客吧
2019-03-15
Linux Ubuntu 用命令安装MySql
2019-03-15
java中简单实现栈
2019-03-15
ajax异步提交失败
2019-03-15
查看安卓系统是否卡开了可调试debuggable
2019-03-15
一道简单的访问越界、栈溢出pwn解题记录
2019-03-15
ubuntu18.04.4版本安装docker教程
2019-03-15
嵌入式day17
2019-03-15
Java基础编程
2019-03-15
STS 的共享内存过程(待充分理解)
2019-03-15
CreatePointFont使用方法
2019-03-15