如何在 c# 上创建的 c++ 上释放对象

本文关键字:c++ 释放 对象 创建 | 更新日期: 2023-09-27 18:31:05

我创建了一个com可见的c# dll。我有一个工厂方法来创建对象。我可以在 c++ 上使用和创建对象,但似乎该对象没有被解除分配。如何解除分配它们。要清楚起见,请检查代码

-------------------C#------------------------

public interface IFoo()
{
    void foo();
}
public class A:IFoo
{
//interface implemented here.
}
public interface IClassFactory
{
     IFoo create();
}
public class TestFactory:IClassFactory
{
 public IFoo create()
 {
     return new A();
 }
}

--------------------C++-------------------

IClassFactory * ptrClassFactory;
CoInitilize(ptrClassFactory);//
IFoo * mObject = ptrClassFactory->create(); //this object is now garbage colledted //or so ? 
// delete mObject; gives error on my case.

如何在 c# 上创建的 c++ 上释放对象

永远不要在指向 COM 对象的指针上调用 delete,因为对象是引用计数的,您应该在 COM 实例上调用 Release() 以释放引用计数 - 然后对象可以根据需要释放其内存/资源

看来你在谈论 COM。由于对象应该从 IUnknown 继承,因此您有 AddRef Release 方法,这些方法正是用于在不再需要对象时使用引用计数来释放对象的内存。

只需调用 release 并在 C# 中实现 release,如果尚未以这种方式实现,则无需执行任何操作。

如果您不是在谈论COM,那么您仍然可以使用COM方式来释放对象。在 C# 中保留引用计数,并添加 C# 函数,C++将调用这些函数来更新对象。当 ref 计数达到零时,C++不再需要该对象,可以丢弃它并留给垃圾回收器。