Memory C++/CLI ref类未被释放
我有一个未管理的类和一个逻辑连接的ref类:Memory C++/CLI ref类未被释放,memory,garbage-collection,c++-cli,Memory,Garbage Collection,C++ Cli,我有一个未管理的类和一个逻辑连接的ref类: public ref class RefBlah { ~RefBlah(); !RefBlah(); internal: UnManagedBlah* m_unmanaged; } public class UnManagedBlah { public: gcroot<RefBlah^> refBlah; } public ref class RefBlah { ~RefBlah(); !R
public ref class RefBlah
{
~RefBlah();
!RefBlah();
internal:
UnManagedBlah* m_unmanaged;
}
public class UnManagedBlah
{
public:
gcroot<RefBlah^> refBlah;
}
public ref class RefBlah
{
~RefBlah();
!RefBlah();
内部:
UnManagedBlah*m_unmanaged;
}
公共类非托管数据库
{
公众:
gcroot refBlah;
}
RefBlah类始终创建UnManagedBlah的实例,该实例包含对创建它的对象的引用
现在,当我在C#应用程序中创建RefBlah的实例时,它在超出范围时不会被释放。(我一直在等待,看到所有其他对象都被释放,但它拒绝自行移除)
据我所知,如果它们都是常规的.Net对象,那么它们都会在类超出范围时被收集,因为尽管引用计数没有达到0。这是因为主堆栈中的对象没有引用根
NET GC是否以不同的方式处理来自非托管类的引用
如何更改设计,以便RefBlah被销毁?我认为您有一个循环引用问题
RefBlah
只有在UnManagedBlah
中的引用是GC'd时才会获得GC'd,而只有在RefBlah
等中删除指针时才会获得GC'd
如果您需要在非托管类中有一个引用,那么它可能应该是一个弱引用?请查看结构:
GCHandle类与
GCHandleType枚举以创建
与任何托管
对象这个手柄可以是四个手柄中的一个
类型:虚弱,虚弱,复活,
正常,或固定。当手柄打开时
已分配,您可以使用它来
防止托管对象被删除
由垃圾收集器收集
当非托管客户端持有
仅供参考。没有这样的把手,,
对象可以由
完成之前的垃圾收集器
代表非托管机构开展工作
客户
我想你有一个循环参考问题
RefBlah
只有在UnManagedBlah
中的引用是GC'd时才会获得GC'd,而只有在RefBlah
等中删除指针时才会获得GC'd
如果您需要在非托管类中有一个引用,那么它可能应该是一个弱引用?请查看结构:
GCHandle类与
GCHandleType枚举以创建
与任何托管
对象这个手柄可以是四个手柄中的一个
类型:虚弱,虚弱,复活,
正常,或固定。当手柄打开时
已分配,您可以使用它来
防止托管对象被删除
由垃圾收集器收集
当非托管客户端持有
仅供参考。没有这样的把手,,
对象可以由
完成之前的垃圾收集器
代表非托管机构开展工作
客户
很好,我不知道你可以在C#中创建弱引用。循环引用不会对.Net产生太大的影响。问题在于,因为UnManagedBlah是非托管的,所以在非托管代码中引用被引用对象时,CLI不会释放该对象。但是解决方案还是解决了问题。很好,我不知道你可以在C#中创建弱引用。循环引用不会对.Net产生太大的影响。问题在于,因为UnManagedBlah是非托管的,所以在非托管代码中引用被引用对象时,CLI不会释放该对象。但解决方案还是解决了问题。