【问题标题】:Are managed pointers in c++/cli initialized to nullptr automatically using GCRoot?c++/cli 中的托管指针是否使用 GCRoot 自动初始化为 nullptr?
【发布时间】:2021-03-25 15:23:09
【问题描述】:

我只需要在托管代码可访问的 C++/CLI 类中初始化一次变量。使用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 代码比较陌生。而且我无法通过谷歌搜索快速找到答案。而且我相信这个社区中有人知道答案。

【问题讨论】:

    标签: c++-cli


    【解决方案1】:

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

      if(_myOtherClass == nullptr)
    

    上面的代码无法使用error C2088: '==': illegal for struct 编译,因为gcroot 包装了GCHandle 结构,无法直接与nullptr 进行比较。

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

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

    【讨论】:

      猜你喜欢
      • 2013-07-06
      • 1970-01-01
      • 1970-01-01
      • 2020-10-15
      • 1970-01-01
      • 2010-09-25
      • 2017-09-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多