2015-11-06 45 views
-1

我想了解下面的代碼。如何在C++中不使用變量賦值的方法?

#include <vcl.h> 
#pragma hdrstop 

#include "Unit1.h" 
#pragma package(smart_init) 
#pragma resource "*.dfm" 
TForm1 *Form1; 

class A 
{ 
    public : 
    void Test(); 
}; 

void A::Test() 
{ 
    ShowMessage("Hello"); 
} 

__fastcall TForm1::TForm1(TComponent* Owner) 
    : TForm(Owner) 
{ 
A *x; 
x->Test(); 
} 

我期待EAccessViolation錯誤,當我調用Test方法時。

如何在沒有x分配的情況下工作?

+2

這是未定義的行爲,任何事情都可能發生,包括您看到的行爲。 –

回答

4

如何在沒有x分配的情況下工作?

理論上,發佈的代碼會導致未定義的行爲。

實際上,它有些作用,因爲A::Test()不依賴於任何成員數據。不保證在每個平臺上工作。

+0

哪個平臺無法正常工作?我想測試它。 –

+0

@İsmailKocacan沒有人可以告訴你。它可能在一些平臺上的某些外部環境下工作,例如,編譯器開關。正如R Sahu寫道:它是_undefined_行爲,所以編譯器可以自由地採取月亮的階段來決定在這裏做什麼。 – cdonat

+0

@İsmailKocacan,我在cygwin下用VS 2008,VS 2010和g ++ 4.9.3測試了你的代碼。他們都工作得很好。但是,那並不能說明它會在哪裏失敗。這是** Undefined Behavior **的難點。你不知道你什麼時候會遇到問題。 –