函数作用域的静态非 Pod 对象初始化

Function Scoped Static Non Pod Object Initialization

本文关键字:Pod 对象 初始化 静态 作用域 函数      更新时间:2023-10-16

我的印象是函数范围的非 Pod 结构被初始化了首次调用函数时。但是,在VS-2010上,如果构造函数抛出异常,则每次都会调用构造函数,直到构造成功为止。

此行为实现是特定于的还是标准保证的?

下面是演示行为的人为示例:

#include <iostream>
#include <string>
using namespace std;
//dummy resource class
class Resource {
 public:
 Resource() {
   cerr<<"Allocate Resource "<<endl;
 }
~Resource() {
   cerr<<"Free Resource"<<endl;
 }
};
//dummy class which will be statically instantiated
class Dummy {
  public:
 Dummy()  {
   cerr<<"in Dummy"<<endl;
   throw(string("error"));
  }
  Resource res;
};
//main program
int main()  {
 for(int i = 0;i<3;i++) {
   try {
     //create a static object  throw and exception
     static Dummy foo;
   }
   catch ( std::string &e) {
     cerr<<"Caught exception:"<<e<<endl<<endl;
   }   
 }
 return 1;
}

输出:

迭代次数:0

分配资源

静态对象构造函数

免费资源

捕获异常:错误

迭代次数:1

分配资源

静态对象构造函数

免费资源

捕获异常:错误

迭代次数:2

分配资源

静态对象构造函数

免费资源

捕获异常:错误**

我的印象是函数作用域的非 Pod 结构在第一次调用函数时被初始化。

当然,但是考虑一下"初始化"是什么意思 - 如果构造函数抛出,则对象不会初始化,因为没有对象。因此,下次遇到对象声明时,它将(尝试)再次初始化。