千家信息网

C++中为什么不要泄漏任何资源

发表于:2024-12-03 作者:千家信息网编辑
千家信息网最后更新 2024年12月03日,这篇文章主要介绍"C++中为什么不要泄漏任何资源",在日常操作中,相信很多人在C++中为什么不要泄漏任何资源问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"C++中为什么
千家信息网最后更新 2024年12月03日C++中为什么不要泄漏任何资源

这篇文章主要介绍"C++中为什么不要泄漏任何资源",在日常操作中,相信很多人在C++中为什么不要泄漏任何资源问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"C++中为什么不要泄漏任何资源"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

P.8: Don't leak any resources(不要泄漏任何资源)

Reason(原因)

Even a slow growth in resources will, over time, exhaust the availability of those resources. This is particularly important for long-running programs, but is an essential piece of responsible programming behavior.

即使是资源的缓慢增长,经过一定时间之后,也会最终耗尽该资源的可用性。这对长时间运行的程序特别重要,也是重要编程活动中必不可少的一部分。

Example, bad(反面事例)

void f(char* name){    FILE* input = fopen(name, "r");    // ...    if (something) return;   // bad: if something == true, a file handle is leaked    // ...    fclose(input);}
译者注:由于某种原因,代码在fclose之前退出执行时,会导致文件无法关闭。

Prefer RAII:(使用RAII的更好示例)

void f(char* name){    ifstream input {name};    // ...    if (something) return;   // OK: no leak    // ...}

译者注:

资源获取即初始化(Resource Acquisition Is Initialization),或称 RAII,是一种 C++ 编程技术,它将必须在使用前请求的资源(分配的堆内存、执行线程、打开的套接字、打开的文件、锁定的互斥体、磁盘空间、数据库连接等--任何存在受限供给中的事物)的生命周期绑定与一个对象的生存期相绑定。

Note(注意)

泄漏也常被成为"任何没有被清理的东西"。更加重要的分类是"任何不会被清理的东西"。例如从堆中分配一个对象然后丢失了最后一个指向那个对象指针。这个规则不应该被理解为这样的要求:即长生命周期对象必须被在程序停止运转时释放。例如,利用进程停止运行时保证的关闭文件,释放内存处理的做法会简化代码,但是依赖严格清理规则的做法可以简单而且更安全。

Note(注意)

推行生命周期安全规则群可以排除资源泄漏。和RAII提供的资源安全机制一起使用的话,可以(通过不产生垃圾)排除"垃圾收集"的需求。再结合执行类型和边界规则群,你可以得到完全的类型和资源安全,一切都由工具保证。

Enforcement(执行建议)

  • Look at pointers: Classify them into non-owners (the default) and owners. Where feasible, replace owners with standard-library resource handles (as in the example above). Alternatively, mark an owner as such using owner from the GSL.

    关注指针:按照所有者的有无(缺省为无)进行分类。如果可能,将所有者替换为标准库中的资源句柄(例如上面的示例)。使用GSL中的owner关键字标识所有者。

  • Look for naked new and delete

    关注直接的new和delete

    关注

  • Look for known resource allocating functions returning raw pointers (such as fopen, malloc, and strdup)

    关注已知的返回原始指针的资源分配函数(例如fopen,malloc和strdup)

到此,关于"C++中为什么不要泄漏任何资源"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

0