2015-11-06 21 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 **的难点。你不知道你什么时候会遇到问题。 –