为什么 `__attribute__((cleanup(...)))` 不更被人知晓?

主要观点:

  • __attribute__((cleanup(...)))在clang中受支持,可用于管理内存等资源,但没人谈论,Linux 人甚至尝试用 Rust 保证内存安全,引发疑问为何不先试试该特性。
  • 有人认为使用该特性多年后发现 RAII 更好,且编写 C 代码时记得添加清理属性较麻烦,不如直接用 C++。
  • 自动清理虽好但内存安全不止于此,Rust 安全保证不包括不泄露内存。
  • 该特性是非标准属性,跨编译器移植性差,虽在 Linux 内核中使用但并非广泛使用。
  • 规则五/三虽需编写一些代码但并非增加大量 boilerplate,需明确是否偏离默认行为。
  • 在较大 C++项目中使用非标准scope_guard进行资源清理比组合式 RAII 更易出错且难维护。
  • __attribute__((cleanup))存在局限性,如仅适用于特定分配方式,无法处理函数失败和成功时的不同清理需求等,且不支持 MSVC,在 Linux 内核中使用也有不便。
  • 有人使用该特性,认为其能减少 C 中早期返回的风险,希望其能成为标准。
  • 认为 Linux 人尝试 Rust 更多是出于政治原因,而非单纯为了内存安全,Rust 在处理资源管理方面更全面可靠。

关键信息:

  • 示例代码展示了defer宏和freep函数的使用。
  • 不同人对__attribute__((cleanup(...)))的看法和经验,包括其优点(如局部锁定)、缺点(如代码冗余、跨编译器问题等)。
  • 与 C++的 RAII 进行比较,讨论两者的优缺点。

重要细节:

  • 多个评论者提及在不同情况下使用__attribute__((cleanup(...)))的注意事项和局限性。
  • 讨论了在不同编译器(如 MSVC)中的支持情况。
  • 提到 Linux 内核中对该特性的使用及相关讨论。
阅读 6
0 条评论