C++\CLI

gcroot和auto_gcroot的差异

2021-07-05  本文已影响0人  左图右码

auto_gcroot是对gcroot的包装,在析构函数中调用delete删除gcroot中的句柄,gcroot仅仅是在析构中调用GCHandle的Free释放控制权,让GC对资源进行生命周期的管理,GC回收的时候只会调用终结器。
所以不同的在于:

  1. gcroot调用终结器,释放的时机由GC决定。
  2. auto_gcroot调用析构器,立即释放资源。
ref class mclass1
{
public:
    ~mclass1()
    {
        System::Console::WriteLine("~mclass1()");
    }
    !mclass1()
    {
        System::Console::WriteLine("!mclass1()");
    }
};
ref class mclass2
{
public:
    ~mclass2()
    {
        System::Console::WriteLine("~mclass2()");
    }
    !mclass2()
    {
        System::Console::WriteLine("!mclass2()");
    }
};

int main(array<System::String ^> ^args)
{
    msclr::gcroot<mclass1^> g1 = gcnew mclass1;
    msclr::auto_gcroot<mclass2^> g2 = gcnew mclass2;
    return 0;
}

output:

~mclass2()
!mclass1()

隐含的习惯就是auto__xx都是调用析构函数,比如auto_handle:

// destroy the object
 ~auto_handle()
{
    if( valid() )
    {
        delete m_handle;
    }
}

C++\CLI中的对象句柄都是managed对象,是GC管理回收的,使用auto_handle管理它们只是加入的手动管理的功能,强调了”立即“的概念。

上一篇下一篇

猜你喜欢

热点阅读