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)
我只需要在 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)