2016-09-27 128 views
-1

我在C++/cli中有下面的代码。从空对象的成员函数初始化静态成员

#include "stdafx.h" 

using namespace System; 

ref class Test 
{ 
public: 
    void SetI(int k) 
    { 
     i = k; 
    } 
private: 
    static int i = 0; 
}; 

int main(array<System::String ^> ^args) 
{ 
    Test ^obj = nullptr; 
    obj->SetI(10); 

    Console::WriteLine(L"Hello World"); 
    return 0; 
} 

在主要eventhough obj是nullptr和调用SetI,它没有任何崩溃的工作。 如果Test的varibale i成为成员变量,则SetI调用nullptr坠毁。 可能是什么原因。

+1

C++/CLI没有C#功能,承诺您在呼叫站点获得NRE。 UB就像使用本地C++一样。它不会崩溃,因为您不取消引用* this,该变量是静态的。当然它不是静态的。 –

回答

0

你是指常规的成员变量而不是静态成员?

静态内存成员始终保留。它生活在其他地方,而不是任何创建的对象的内存位置。这就是它可以用空类设置的原因。

常规成员存在于创建对象的内存中,如果不存在此类对象,则会出现段错误。