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
分配資源
靜態對象構造
免費資源
捕捉到異常:錯誤**
謝謝你有道理,所以我想這種行爲是不是編譯器特定? – keety 2012-04-25 00:43:17
@ keety:正確的,這個行爲是由C++標準強制的。 – ildjarn 2012-04-25 01:34:59