C++核心准则讨论:持有没有被句柄管理的资源时切勿抛出异常
Discussion: Never throw while holding a resource not owned by a handle
讨论:持有没有被句柄管理的资源时切勿抛出异常
Reason(原因)
That would be a leak.
这回引发资源泄露。
Example(注意)
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:
void f(int i)
{
unique_ptr f(fopen("a file", "r"), fclose);
// ...
if (i == 0) return;
// ...
}
Better:
更好的做法:
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
新书介绍
《实战Python设计模式》是作者最近出版的新书,拜托多多关注!
本书利用Python 的标准GUI 工具包tkinter,通过可执行的示例对23 个设计模式逐个进行说明。这样一方面可以使读者了解真实的软件开发工作中每个设计模式的运用场景和想要解决的问题;另一方面通过对这些问题的解决过程进行说明,让读者明白在编写代码时如何判断使用设计模式的利弊,并合理运用设计模式。
对设计模式感兴趣而且希望随学随用的读者通过本书可以快速跨越从理解到运用的门槛;希望学习Python GUI 编程的读者可以将本书中的示例作为设计和开发的参考;使用Python 语言进行图像分析、数据处理工作的读者可以直接以本书中的示例为基础,迅速构建自己的系统架构。
觉得本文有帮助?请分享给更多人。
关注微信公众号【面向对象思考】轻松学习每一天!
面向对象开发,面向对象思考!