1
何時初始化靜態局部變量? 如果在構造函數中引發異常,是否構造了該對象?這個析構函數會被調用嗎?如果在初始化靜態局部變量之前發生異常,會發生什麼情況?
考慮休耕代碼:
#include <iostream>
#include <exception>
int x = 0;
class A {
public:
A() {
std::cout << 'a';
if (x++ == 0) {
throw std::exception();
}
}
~A() { std::cout << 'A'; }
};
class B {
public:
B() { std::cout << 'b'; }
~B() { std::cout << 'B'; }
A a;
};
void foo() { static B b; }
int main() {
try {
foo();
}
catch (std::exception &) {
std::cout << 'c';
foo();
}
}
輸出:acabBA
第一次FOO()被調用,B試圖初始化。它的構造函數被調用,它首先構造所有的成員變量。這意味着調用A :: A(),打印一個。 A :: A()然後拋出一個異常,構造函數被中止,並且b或B :: a都不被認爲是構造的。
爲什麼b第一次沒有初始化?
並以破壞靜態變量的順序它不會有任何影響? – Adib
@Adib:我不明白 - 影響什麼?靜態變量按照其構造的相反順序銷燬(但當然這隻有在建築實際發生時纔有意義)。 –
是的,我完全想知道這一點,因爲靜態變量在異常之前沒有構建,所以它不會改變破壞順序。對 ? – Adib