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

时间:2018-02-20 21:05:50

标签: c++ c++11 static

我使用的常见模式是:

const string& GetConstString() {
  static const auto* my_string = new string("useful const string");
  return *my_string;
}

[这不是泄漏!见this video] 这解决了许多终身问题。 string可以替换为任何具有非常重要的dtor的类型。

如果你的类型有默认的ctor&琐碎的dtor,你可以简单地做

const MyType& GetConstMyType() {
  static MyType my_type;
  return my_type;
}

我正在使用一个有默认ctor和普通dtor的课程。我想知道这个类是默认值还是值初始化。事实证明,it doesn't really matter for class-types。所以这成了一个学术问题[例如,如果你有这个类的数组]。

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

2 个答案:

答案 0 :(得分: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;
}

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

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

答案 1 :(得分:0)

根据“轨道中的轻度赛跑”的评论,答案是:

静态对象将使用与非静态对象完全相同的规则初始化默认值/值。