从空对象的成员函数初始化静态成员
问题描述:
我在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坠毁。 可能是什么原因。
答
你是指常规的成员变量而不是静态成员?
静态内存成员始终保留。它生活在其他地方,而不是任何创建的对象的内存位置。这就是它可以用空类设置的原因。
常规成员存在于创建对象的内存中,如果不存在此类对象,则会出现段错误。
C++/CLI没有C#功能,承诺您在呼叫站点获得NRE。 UB就像使用本地C++一样。它不会崩溃,因为您不取消引用* this,该变量是静态的。当然它不是静态的。 –