【问题标题】:How to deallocate object on c++ which is created on c#如何在 c# 上创建的 c++ 上释放对象
【发布时间】:2016-01-20 12:03:47
【问题描述】:

我创建了一个 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.

【问题讨论】:

  • 它创建一个新的 A 类并将其返回为 IFoo ,查看 IClassFactory imp。
  • 对不起,反过来读;那么,你是如何从你的 C++ 消费者那里释放 COM 对象的呢?
  • 这是我目前的问题,我无法释放它们。如果我调用 delete * fooPtr ,我的 c++ 代码就会崩溃。我观察了内存使用情况,发现只要创建新对象,我使用的内存就会变大。
  • @RowlandShaw 是的,我的意思是 mObject->Release();

标签: c# c++ memory-management com-interop


【解决方案1】:

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

【讨论】:

  • 我写了一个测试方法,试着看看它是否真的有效。在 for 循环中,我调用了 IFoo * mObject = ptrClassFactory->create(); IFoo->释放()。但是在某些点之后它在发布方法上崩溃了。就我而言,它在 i == 300 时崩溃。
  • 您的代码中没有i,所以我只能将您推荐给您的调试器,它可能能够提供更多为什么失败的详细信息(异常等.)
【解决方案2】:

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

如果还没有以这种方式实现,只需在 C# 中调用 release 并实现 release 即可。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-05
    • 2010-09-24
    • 2010-12-22
    • 1970-01-01
    • 2011-10-16
    • 2015-04-25
    • 1970-01-01
    • 2012-03-05
    相关资源
    最近更新 更多