前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++核心准则​讨论:持有没有被句柄管理的资源时切勿抛出异常

C++核心准则​讨论:持有没有被句柄管理的资源时切勿抛出异常

作者头像
面向对象思考
发布2020-12-31 14:50:48
6420
发布2020-12-31 14:50:48
举报

Discussion: Never throw while holding a resource not owned by a handle

讨论:持有没有被句柄管理的资源时切勿抛出异常

Reason(原因)

That would be a leak.

这回引发资源泄露。

Example(注意)

代码语言:javascript
复制
void f(int i)
{
    FILE* f = fopen("a file", "r");
    ifstream is { "another file" };
    // ...
    if (i == 0) return;
    // ...
    fclose(f);
}

If i == 0 the file handle for a file is leaked. On the other hand, the ifstream for another file will correctly close its file (upon destruction). If you must use an explicit pointer, rather than a resource handle with specific semantics, use a unique_ptr or a shared_ptr with a custom deleter:

如果i == 0,则文件的句柄发生泄漏。另一方面,另一个文件的ifstream将正确关闭其文件(销毁时)。如果必须使用显式指针,而不是具有特定语义的资源句柄,请使用带有自定义删除器的unique_ptr或shared_ptr:

代码语言:javascript
复制
void f(int i)
{
    unique_ptr<FILE, int(*)(FILE*)> f(fopen("a file", "r"), fclose);
    // ...
    if (i == 0) return;
    // ...
}

Better:

更好的做法:

代码语言:javascript
复制
void f(int i)
{
    ifstream input {"a file"};
    // ...
    if (i == 0) return;
    // ...
}
Enforcement(实施建议)

A checker must consider all "naked pointers" suspicious. A checker probably must rely on a human-provided list of resources. For starters, we know about the standard-library containers, string, and smart pointers. The use of span and string_view should help a lot (they are not resource handles).

检查器必须将所有“暴露的指针”视为可疑。检查器可能必须依靠人工提供的资源列表。首先,我们了解标准库容器,字符串和智能指针。使用span和string_view应该会很有帮助(它们不是资源句柄)。

原文链接https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#discussion-never-throw-while-holding-a-resource-not-owned-by-a-handle

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-12-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 面向对象思考 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Enforcement(实施建议)
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档