改善程序与设计的55个具体做法 day6
条款13:以对象管理资源
资源,包括但不限于内存、句柄、GDI对象、数据库连接等。
内存要记得释放,句柄要记得closehandle, GDI对象要记得删除,数据库连接要记得关闭,等等等等。
以对象来管理这些资源就是利用 对象的构造和析构 特性,在构造函数中获得资源并在析构函数中释放资源。
两个智能指针auto_ptr 和 std::tr1::shared_ptr,前者同一时刻只能指向同一个资源,赋值的一方不再指向这个资源,被赋值的一方指向这个资源。在析构函数中对对象调用delete(而不是delete[])。
shared_ptr利用引用计数,多个指针可以指向同一个对象,当引用技术为0时,对对象调用delete(而不是delete[])。
条款14:在资源管理类中小心copying行为
这个比较好理解,管理资源的对象的copying行为(拷贝构造 和 operator=)一定要谨慎
a 必要的时候可以不允许其对外界有copying行为
b 对其管理的底层资源使用饮用计数机制(比如 shared_ptr)
c 复制其管理的底部资源(深拷贝)
d 转移其惯例的底部资源的拥有权(比如 auto_ptr)
条款15:在资源管理类中提供对原始资源的访问
原始资源 也就是上一条款中提到的 底部资源。
a 显式转换
Pointer Get() const; 提供get函数
b 隐式转换
operator 类型(){return m_ptr; } 提供类型转换函数
条款16:成对使用new 和 delete 时要采取相同形式
即 new - delete, new [] - delete[]
这样做到原因是new[] 会在内存中记录个数,当delete[]的时候会去这(几)个内存单元读取该个数,然后按照该个数去释放(析构)内存。
如果是 new [] - delete,则可能会造成资源泄漏, 如果是 new - delete[] 则可能会导致未定义的问题。
条款17:以独立语句将newed 对象置于智能指针
这句话乍读有点绕口,其实代码写出来很简单。
e.g.
void Func(std::tr1::shared_ptr<CObject> ptr, int a)
调用时, Func(std::tr1::shared_ptr<CObject>(new CObject), GetA()), 由于参数的调用顺序和编译器的优化问题,可能会产生如下顺序的(伪)代码:
new CObject;
GetA();
std::tr1::shared_ptr<CObject>(指针)
当GetA的调用产生异常时,可能导致执行不到第三行,这样CObject对象就不会被释放了,从而造成内存泄漏。
所以本条款要说的是:
std::tr1::shared_ptr<CObject> ptr(new CObject);
Func(ptr, GetA);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗