千家信息网

C++为什么类请求的所有资源必须在析构函数释放

发表于:2024-11-28 作者:千家信息网编辑
千家信息网最后更新 2024年11月28日,这篇文章主要介绍"C++为什么类请求的所有资源必须在析构函数释放",在日常操作中,相信很多人在C++为什么类请求的所有资源必须在析构函数释放问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法
千家信息网最后更新 2024年11月28日C++为什么类请求的所有资源必须在析构函数释放

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

类申请的所有资源必须在析构函数释放

Reason(原因)

避免资源泄露,特别是在发生错误的情况下。

Note(注意)

如果资源表现为实现了全套默认操作的类,这些会自动发生。

Example(示例)
class X {    ifstream f;   // may own a file    // ... no default operations defined or =deleted ...};

X类的ifstream成员通过析构函数隐式关闭任何它打开的任何文件。

Example, bad(反面示例)
class X2 {     // bad    FILE* f;   // may own a file    // ... no default operations defined or =deleted ...};

X2 may leak a file handle.

X2存在泄露文件句柄的可能性。(具体讲通常是漏掉关闭文件,译者注)

Note(注意)

sokcet(通信,译者注)没有被关闭会怎么样?首先,析构函数,关闭或清除操作永远不应该失败。如果它确实会失败,这问题还没有真正好的解决方案。对于(通信,译者注)起始模块,析构函数的作者并不知道析构函数因为什么被调用,而且没有办法通过抛出异常来"拒绝处理"。更为严重的是,许多"关闭/释放"操作都无法重试。为了解决这个问题有过许多尝试,不是没有找到通用的解决方案。如果可能,可以将关闭或清除的失败看作根本性错误并终止。

Note(注意)

类可以持有指向那些它并不拥有所有权的对象的指针或引用。显然,这样的对象不应该被该类的析构函数销毁。例如:

Preprocessor pp { /* ... */ };Parser p { pp, /* ... */ };Type_checker tc { p, /* ... */ };

这里p指向了pp但是并不拥有pp。

Enforcement(实施建议)

  • (Simple) If a class has pointer or reference member variables that are owners (e.g., deemed owners by using gsl::owner), then they should be referenced in its destructor.

    (简单)如果类包含具有所有权(例如通过gsl::owner宣示所有权)的指针或引用成员,则它们应该在析构函数中被引用。

    译者注:个人觉得应该是在析构函数中释放。

  • (Hard) Determine if pointer or reference member variables are owners when there is no explicit statement of ownership (e.g., look into the constructors).

  • (困难)在指针或引用类型的成员变量没有明确陈述所有权时判断它们是否是所有者(例如通过走查构造函数等方式)。

到此,关于"C++为什么类请求的所有资源必须在析构函数释放"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

0