2016-09-27 132 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

你是指常規的成員變量而不是靜態成員?

靜態內存成員始終保留。它生活在其他地方,而不是任何創建的對象的內存位置。這就是它可以用空類設置的原因。

常規成員存在於創建對象的內存中,如果不存在此類對象,則會出現段錯誤。