Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory C++/CLI ref类未被释放_Memory_Garbage Collection_C++ Cli - Fatal编程技术网

Memory C++/CLI 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

我有一个未管理的类和一个逻辑连接的ref类:

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不会释放该对象。但解决方案还是解决了问题。