功能本地静态是默认值还是值初始化?

wrh*_*all -2 c++ static c++11

我使用的常见模式是:

const string& GetConstString() {
  static const auto* my_string = new string("useful const string");
  return *my_string;
}
Run Code Online (Sandbox Code Playgroud)

[这不是泄漏!观看此视频] 这解决了许多终身问题.string可以用任何具有重要dtor的类型替换.

如果你的类型有默认的ctor和普通的dtor,你可以这样做

const MyType& GetConstMyType() {
  static MyType my_type;
  return my_type;
}
Run Code Online (Sandbox Code Playgroud)

我正在和一个有默认ctor和普通dtor的班级一起工作.我想知道这个类是默认值还是值初始化.事实证明,它对于类类型并不重要.所以这成了一个学术问题[例如,如果你有这个类的数组].

但它是默认值还是值初始化?

Lig*_*ica 6

我没有看到指针解决的生命周期问题.实际上,它增加了一个:内存泄漏.

应该使用第二个版本,它将(最终)初始化,就像没有static关键字一样.

const string& GetConstString()
{
   // Initialised on first use; destroyed properly on program exit
   static const std::string my_string("useful const string");
   return my_string;
}
Run Code Online (Sandbox Code Playgroud)

这具有不是双动态分配的额外好处.

更一般地说,使用哪种特定类型的初始化取决于您在代码中编写的内容.

  • OP的第一个示例是如何泄漏内存的?可以创建一个字符串实例,并且指针永远不会丢失. (6认同)
  • @jameslarge:你不想丢失指针的原因是,如果你这样做,你就不能"删除"它.如果你保留指针但不要"删除"它,你仍然有同样的问题. (2认同)
  • 如果你保留一个指向某个东西的指针,而你永远不会删除它,那么你没有_problem_,你有一个可以使用的指针.在这种情况下,您有一个指向"有用的const字符串"的指针."内存泄漏"意味着失去使用未能解除分配的内容的能力. (2认同)
  • @jameslarge:你错过了一点,那就是你'新'的东西然后没有'删除'它.这是教科书内存泄漏.的定义,甚至. (2认同)
  • 在那种情况下,我曾经处理过的每个程序都有内存泄漏.但幸运的是,他们中的大多数只有_good_类型的内存泄漏. (2认同)
  • @jameslarge我很好奇内存泄漏是什么样的. (2认同)
  • @wrhall:与非`静态`完全相同 - 它实例化一个对象,其语法与你在其他地方使用的语法相同.关于`static`关键字的作用似乎有些误解. (2认同)