【问题标题】:Not deleting a static pointer (google style)不删除静态指针(谷歌风格)
【发布时间】:2021-05-19 02:42:30
【问题描述】:

根据Google C++ Style Guide - Static and Global Variables

销毁决定

...
因此,我们只允许具有静态存储持续时间的对象,前提是它们可以简单地破坏。

常见模式

...

  • 映射、集合和其他动态容器:...如果您确实更喜欢标准库中的动态容器,请考虑使用函数局部静态指针,如下所述。
  • 如果所有其他方法都失败了,您可以使用函数局部静态指针或引用(例如,static const auto& impl = *new T(args...);)动态创建一个对象,并且永远不要删除它。

据我所知,动态分配的对象永远不会被释放。
当程序结束时,操作系统会释放所有未释放的对象,但这不是正确的方法。
为什么删除动态分配的对象是一个可选择的选项?

【问题讨论】:

  • 为什么 Google 的“C++ 风格指南”工作可能适用于他们的代码库,这是一种糟糕的通用编码风格。
  • 如果有一个你在整个程序中使用的静态对象,并且该对象不管理内存以外的任何资源,你可能永远不会清除它,因为操作系统会进行清理追随你。这会弄乱检测内存泄漏的工具,所以我不会亲自去做。
  • 似乎保留一个裸静态指针变量并动态创建/删除相应的对象将是一个符合要求的解决方案。所以这里没问题。
  • @AyxanHaqverdili "操作系统会在你之后进行清理" 操作系统只会释放资源,但不会调用析构函数。如果你需要析构函数的功能,你根本不能遵循这样的风格指南。示例:如果您有一个表示持久性的对象,并且将在销毁时将其状态写入文件,则此样式指南根本行不通。我个人不知道本指南有什么帮助。

标签: c++ google-style-guide


【解决方案1】:

为什么不删除动态分配的对象是一个可选选项?

因为这个:

当程序结束时,操作系统将释放所有未释放的对象

简而言之,不释放内存是个问题,因为这会导致内存泄漏形式的不必要的内存使用。不必要的内存使用对于不再运行的程序无关紧要,因此在这种情况下这不是问题。

请注意,如果您确实遵循这种风格,那么您可能会发现一些内存分析器将缺乏释放分配报告为内存泄漏,这可能难以与无意的内存泄漏区分开来。

除了内存泄漏的(非)问题之外,为了解释为什么这可能是一个更可取的选择,这种风格避免了静态初始化顺序惨败的一些问题,而不需要漂亮的计数器成语。作为额外的奖励,它可能会使程序的关闭速度更快一些。

【讨论】:

  • “快一点”也可以是“快很多”。我最糟糕的情况是一个运行了六个小时的程序,其中 4 个在等待硬盘交换被破坏的对象。相反,泄漏对象意味着操作系统只是丢弃了内存,甚至没有触及交换。即时节省 4 小时。
猜你喜欢
  • 2011-07-22
  • 2016-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多