c++ file* 句柄泄漏_C++核心指南:P.8 勿泄漏任务资源

b145a4f24dc6c362200b72f935a09ed9.png

P.8: 勿泄漏任务资源

原因

随着时间的推移,即使是资源的缓慢增长也会耗尽这些资源的可用性,这对于长时间运行的程序特别重要,但也是负责任的编程行为的基本部分。

糟糕的例子

void f(char* name){ FILE* input = fopen(name, "r"); // ... if (something) return; // 糟糕:如果 something == true,文件句柄就泄漏了 // ... fclose(input);}

优先使用RAII:

void f(char* name){ ifstream input {name}; // ... if (something) return; // OK: 没有泄漏 // ...}

参考: 资源管理部分

注意

泄漏通俗地说就是“任何没有被清理的东西”,更重要的分类是“任何不能再被清理的东西”。例如,在堆上分配了一个对象,然而丢失了指向该块内存(分配)的指针。 不应将此规则应用在程序关闭期间需返回长生命周期对象的分配(译注:在程序退出期间的内存分配可以不需要遵守这些规则),例如,依赖于系统保证的清理可以简化代码,比如关闭文件和在进程关闭时释放内存。然而,依赖于隐式清理的抽象也同样简单,而且通常更安全。

注意

使用生命周期安全性剖面(profile) 来消除泄漏,当与RAII提供的资源安全相结合时,就没了"垃圾回收"的需求。当使用类型和边界剖面(profiles)时,你可以获得由工具保证的类型和资源安全。

实施

  • 查看指针:将它们分为非所有者(默认)和所有者(owner),在可行的地方,用标准库资源句柄替换所有者(如上面的示例所示),或者使用GSL中的owner来标记所有者。
  • 查看裸用的new和delete
  • 查看已知返回原始指针的资源分配函数(如fopen, malloc 和 strdup)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值