gpt4 book ai didi

c# - native 和托管析构函数

转载 作者:可可西里 更新时间:2023-11-01 08:26:02 26 4
gpt4 key购买 nike

我有一个 native 对象 (C++),它有一个指向托管对象 (C#) 的 gcroot 指针。

class SomeNativeClass {
gcroot<SomeManagedClass ^> managedClass;
};

问题当我在我之前分配的 native 代码 delete(someNativeClass) 中删除此类的 native 实例时,managedClass 实例是否会被垃圾收集或我是否应该显式删除它(在 native 析构函数)也是吗?

最佳答案

If only delete the native object and the managed is not referenced anywhere else, would it be garbage collected?

这就是垃圾回收的本质。当收集器找不到对象的引用时,收集器会销毁该对象。当您使用 gcroot<> 模板类时,它的完成方式有点不同,收集器查找对托管对象的引用的“正常”方式是通过在 cpu 寄存器和托管代码堆栈以及托管堆中发现它们。这在 native 代码中不起作用,gcroot<> 类可以提供帮助。

gcroot<> 构造函数调用 GCHandle::Alloc() 来分配对对象的显式引用。它的析构函数调用 GCHandle::Free() 来删除它。能够分配这些“跟踪句柄”是 CLR 中的一种辅助机制,它为它们维护一个表,收集器除了自己找到的引用之外还查阅该表。

最终效果是当你的类析构函数运行时,它会自动调用 gcroot<> 析构函数。对象引用消失了。如果那是唯一的引用(在这种情况下很可能),下一次垃圾收集扫描将销毁该对象。自动地。稍后。

关于c# - native 和托管析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11066880/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com