美文网首页C++\CLI
gcroot和auto_gcroot的差异

gcroot和auto_gcroot的差异

作者: 左图右码 | 来源:发表于2021-07-05 16:27 被阅读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管理它们只是加入的手动管理的功能,强调了”立即“的概念。

相关文章

  • gcroot和auto_gcroot的差异

    auto_gcroot是对gcroot的包装,在析构函数中调用delete删除gcroot中的句柄,gcroot仅...

  • 通过GCHandle在native class内部保存一个man

    一般是通过gcroot<>或者auto_gcroot<>来完成这个工作.但也可以直接用GCHandle来实现。其实...

  • GCRoot

    用于记录学习 一、可达性分析算法:通过一系列的名为“GC Root”的对象作为起点,从这些节点向下搜索,搜索所走过...

  • gcroot

    在java中,可作为GC Roots的对象有: 1.虚拟机栈(栈帧中的本地变量表)中引用的对象; 2.方法区中的类...

  • Java gcroot

    在Java语言中,GC Root主要包括以下几类元素: 1、虚拟机栈中引用的对象比如:各个线程被调用的方法中使用到...

  • 知识点欠缺

    java锁的使用,锁类型(CAS)JVM模型GCRoot有哪些volatile和synchronized(锁升级)...

  • 51 Jvm性能优化-三色标记算法如何处理漏标问题

    1.GC如果想查找到存活的对象,根据可达分析算法 根据GCRoot引用链遍历存活对象。根据GCRoot遍历过程中,...

  • GCRoot与safePoint

    HotSpot虚拟机使用可达性分析算法确定对象是否可以被GC。 可达性分析算法从一系列GCRoot对象开始,向下搜...

  • JVM 中GC Roots对象有哪些?

    在java虚拟机的GC中,什么对象可作为GCRoot的对象?

  • JVM(二) GC算法与分代回收策略

    可达性分析 GCRoot场景 垃圾回收算法 分代回收策略 引用 垃圾回收 垃圾回收(Garbage Collect...

网友评论

    本文标题:gcroot和auto_gcroot的差异

    本文链接:https://www.haomeiwen.com/subject/liliultx.html