2012-04-25 23 views
0

第一次調用函數時,我的印象是函數作用域非窗格結構初始化爲 。然而,在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

我的印象是,函數作用域非Pod結構是i在第一次調用函數時進行調用。

當然,但想想「初始化」是指–如果構造函數拋出,未初始化的對象,因爲沒有對象。因此,下一次遇到對象聲明時,它會(嘗試)再次初始化。

+0

謝謝你有道理,所以我想這種行爲是不是編譯器特定? – keety 2012-04-25 00:43:17

+0

@ keety:正確的,這個行爲是由C++標準強制的。 – ildjarn 2012-04-25 01:34:59