我想知道,沒有其它目的不是純粹的好奇心(因爲任何人都不應該這樣寫代碼!)關於RAII的行爲如何與使用轉到金屬網格(可愛的想法是不是) 。當我們結合RAII和GOTO時會發生什麼?
class Two
{
public:
~Two()
{
printf("2,");
}
};
class Ghost
{
public:
~Ghost()
{
printf(" BOO! ");
}
};
void foo()
{
{
Two t;
printf("1,");
goto JUMP;
}
Ghost g;
JUMP:
printf("3");
}
int main()
{
foo();
}
當在Visual Studio 2005中運行下面的代碼時,我得到以下輸出。
1,2,3 BOO!
但是我想象,猜測,希望'BOO!'實際上不會出現,因爲Ghost應該從未實例化過(恕我直言,因爲我不知道此代碼的實際預期行爲)。
這是怎麼回事?
我意識到,如果我實例化鬼的代碼不編譯一個明確的構造函數...
class Ghost
{
public:
Ghost()
{
printf(" HAHAHA! ");
}
~Ghost()
{
printf(" BOO! ");
}
};
啊,神祕......
我相信這種行爲是正確的。否則,如何在JUMP之後引用變量g? – leiz 2010-03-09 05:00:50
http://xkcd.com/292/ – 2010-03-09 05:21:19