C++ 函数本地静态是默认的还是值初始化的?

C++ 函数本地静态是默认的还是值初始化的?,c++,c++11,static,C++,C++11,Static,我使用的一种常见模式是: const string& GetConstString() { static const auto* my_string = new string("useful const string"); return *my_string; } [这不是泄密!看 这解决了许多生存期问题。string可以替换为具有非平凡dtor的任何类型 如果您有一个带有默认ctor的类型&普通dtor,那么您只需执行以下操作即可 const MyType& GetC

我使用的一种常见模式是:

const string& GetConstString() {
  static const auto* my_string = new string("useful const string");
  return *my_string;
}
[这不是泄密!看 这解决了许多生存期问题。
string
可以替换为具有非平凡dtor的任何类型

如果您有一个带有默认ctor的类型&普通dtor,那么您只需执行以下操作即可

const MyType& GetConstMyType() {
  static MyType my_type;
  return my_type;
}
我正在使用一个具有默认ctor和普通dtor的类。我想知道该类是默认初始化的还是值初始化的。结果是,。因此这成为一个学术问题[例如,如果你有一个此类数组]


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

我不知道指针解决了什么生存期问题。事实上,它增加了一个问题:内存泄漏

您应该使用第二个版本,它将(最终)初始化,就像没有
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;
}
这有一个额外的好处,即不需要双重动态分配

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

根据“轨道上的亮度竞赛”的评论,答案是:


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

为什么
new
以及何时何地调用
delete
?静态首先进行零初始化,然后以指定的任何其他方式进行初始化。因此,即使默认初始化,也不会执行任何操作(就像对于标量),你仍然得到零初始化。我不理解你的问题。使用哪种初始化取决于你使用哪种初始化器。@juanchopanza在这种情况下,简单地“泄漏”并不一定是个坏主意记忆。提图斯·温特斯在他的一次CppCon中谈到了Abseil,但简而言之,使用
new
意味着您不再需要担心销毁顺序和从另一个销毁后访问
my_string
thread@Justin考虑具有析构函数而不仅仅释放内存的对象。HAP是一个在销毁时刷新缓冲区的对象。最好养成不泄漏不关心它的对象的习惯,因为这就是你为一个关心它的对象所做的。OP的第一个示例是如何泄漏内存的?可以创建字符串的一个实例,指针永远不会丢失。@jameslarg:the你不想丢失指针的原因是,如果你这样做,你就不能
删除它。如果你保留了指针,但无论如何都不
删除它,你仍然会遇到同样的问题。如果你保留了指向某个东西的指针,而你从未删除过它,你就没有问题,你就有了指向某个你可以使用的东西的指针。在这种情况下,你有了指向“有用常量字符串”的指针。“内存泄漏”意味着失去使用您未能释放的东西的能力。@jameslarge:您没有抓住重点,那就是您
new
d然后某个东西没有
delete
它。这是一个教科书式的内存泄漏。的定义甚至是。在这种情况下,我曾经处理过的每个程序都有内存泄漏。但幸运的是他们中的大多数人只有良好的内存泄漏。