gcroot和auto_gcroot的差异
2021-07-05 本文已影响0人
左图右码
auto_gcroo
t是对gcroot
的包装,在析构函数中调用delete删除gcroot中的句柄,gcroot仅仅是在析构中调用GCHandle的Free释放控制权,让GC对资源进行生命周期的管理,GC回收的时候只会调用终结器。
所以不同的在于:
-
gcroot
调用终结器,释放的时机由GC决定。 -
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
管理它们只是加入的手动管理的功能,强调了”立即“的概念。