2011-07-22 25 views
2

今天我发现了一个非常隐蔽的bug的来源。这是现在所有的安全固定的,但我想明白为什么当我执行下面的代码:为什么我的函数范围的静态变量在对象实例之间持续存在?

using namespace System; 

ref class EvilClass 
{ 
public: 
    EvilClass() 
    { 

    } 

    void Print() 
    { 
     static bool enablePrint = false; 
     if(enablePrint) 
     { 
      Console::WriteLine("PrintEnabled"); 
     } 
     else 
     { 
      Console::WriteLine("PrintDisabled"); 
     } 
     enablePrint = true; 
    } 

}; 


int main(array<System::String ^> ^args) 
{ 
    Console::WriteLine(L"Hello World"); 

    EvilClass^ ec = gcnew EvilClass(); 

    ec->Print(); 
    ec->Print(); 

    delete ec; 
    ec = nullptr; 

    ec = gcnew EvilClass(); 

    ec->Print(); 
    ec->Print(); 

    delete ec; 
    ec = nullptr; 

    return 0; 
} 

...我得到如下:

Hello World 
PrintDisabled 
PrintEnabled 
PrintEnabled 
PrintEnabled 

我一直以为,静态只会在对同一个类实例的调用之间持续存在?

回答

2

"a static member variable has the same value in any instance of the class and doesn't even require an instance of the class to exist"

到这是非常清晰的静态变量函数调用和类实例之间持续存在。与普通变量不同,静态变量的数据在调用之间保留,并且仅初始化一次。

全局和静态之间的区别在于,全局在任何地方都可用,而静态只在初始化的范围内可用。两者都坚持了整个程序的长度。

http://en.wikipedia.org/wiki/Static_variable

http://c.ittoolbox.com/documents/difference-between-static-global-variable-12174

相关问题