0

Function Scoped Non-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

リソースの割り当て

静的オブジェクト コンストラクター

無料リソース

キャッチされた例外:エラー**

4

1 に答える 1

4

Function Scoped Non-Pod 構造は、関数が初めて呼び出されたときに初期化されるという印象を受けました。

確かに、しかし「初期化された」とはどういう意味か考えてみてください。コンストラクターがスローした場合、 object がないため、オブジェクトは初期化されませ。その結果、次にオブジェクト宣言が検出されたときに、再度初期化 (試行) されます。

于 2012-04-25T00:20:44.003 に答える