Мне нужно инициализировать переменную только один раз в классе C++/CLI, доступном для управляемого кода. Инициализируется ли управляемый указатель на nullptr
при использовании gcroot
? В частности, будет ли функция Initialize
ниже работать так, как я ожидаю? И создавать MyOtherClass
только один раз, независимо от того, сколько раз MyClass::Intialize
вызывается?
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
, согласно Инициализация по умолчанию: «когда дескрипторы объявлены и не инициализированы явно, они по умолчанию инициализируются значением nullptr».
if (_myOtherClass == nullptr)
Вышеупомянутое не может быть скомпилировано с error C2088: '==': illegal for struct
, потому что gcroot
оборачивает структуру GCHandle
, которую нельзя напрямую сравнивать с nullptr
.
Чтобы проверить целевой дескриптор (не дескриптор оболочки), используйте следующее, которое работает должным образом.
if (static_cast<MyOtherClass^>(_myOtherClass) == nullptr)