c++/cli 中的托管指针是否使用 GCRoot 自动初始化为 nullptr?

Are managed pointers in c++/cli initialized to nullptr automatically using GCRoot?

我只需要在 C++/CLI 中初始化一次变量 class 托管代码即可访问。使用 gcroot 时托管指针是否初始化为 nullptr?具体来说,下面的 Initialize 函数是否会像我预期的那样工作?并且无论调用多少次 MyClass::Intialize 都只创建一次 MyOtherClass

class MyClass
{
public:
   void Initialize();

private:

#ifdef _MANAGED
    gcroot<MyOtherClass^> _myOtherClass;
#endif
};

void MyClass::Initialize()
{
    if(_myOtherClass == nullptr)
    {
        _myOtherClass = gcnew MyOtherClass();
    }
}

我正在使用 Visual Studio 2019。访问它的托管对象是用 C# 编写的。我对 CLI 代码比较陌生。而且我无法通过谷歌搜索快速找到答案。我相信这个社区中有人知道答案。

托管句柄默认初始化为 nullptr,根据 Default initialization:“当声明句柄但未显式初始化时,它们默认初始化为 nullptr ".

  if(_myOtherClass == nullptr)

以上无法使用 error C2088: '==': illegal for struct 编译,因为 gcroot 包装了一个 GCHandle 结构,无法直接与 nullptr.

进行比较

要检查 target 句柄(不是 wrapper 句柄),请使用以下命令,它按预期工作。

  if(static_cast<MyOtherClass^>(_myOtherClass) == nullptr)