比如我有一個簡單的代碼:C++ new操作符是如何工作的內部
class B
{
};
class A
{
B b;
public:
A()
{
throw 1;
}
};
int main()
{
A* a = 0;
try
{
a = new A;
}
catch (int)
{
}
}
構造函數拋出異常,那麼析構函數不會被調用。但是B的析構函數會被調用。堆中的內存不會被分配。我的問題如何在內部工作?首先會是:構造A還是在堆中分配內存?那麼,如果分配是第一個,如果存在異常,將如何解除分配?別的,如果構建A是第一個,它是如何應對堆的?
謝謝,你的評論很好,但我需要更多的信息。在堆內存中提供析構函數的機制是什麼? – M90
@ M90,我認爲這個機制是特定於實現的。就像我說的,一個看不見的'try-finally'塊。就像,如果出現問題,控制權轉移到一些自動生成的代碼,負責照顧任何需求,然後繼續傳播異常。編譯你的代碼到程序集中,看看它*真正的作用,如果你真的好奇。 –
@ M90另請參見草藥薩特的[構造失敗...](http://www.gotw.ca/publications/mill13。htm) –