2016-01-20 44 views
0

我創建了com可見的c#dll。我有一個工廠方法來創建對象。我可以在C++上使用和創建對象,但似乎該對象沒有被釋放。我怎樣才能釋放它們。要清除檢查代碼如何釋放c上創建的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. 
+0

它創建一個新的A類並將其作爲IFoo返回,請查看IClassFactory imp。 –

+0

對不起,反過來讀它;那麼,你如何從你的C++消費者發佈COM對象呢? –

+0

這是我目前的問題,我無法釋放他們。如果我調用delete * fooPtr,我的C++代碼就會崩潰。我觀察了內存使用情況,並發現只要創建新對象,我使用的內存就會變得更大。 –

回答

0

看起來好像你在談論COM。 因爲對象應該從IUnknown繼承,所以你有AddRef釋放方法,這些方法正好用於通過在對象上使用引用計數而不再需要時釋放對象內存的目的。

只要在C#中調用release和實現發佈,如果它沒有以這種方式實現,就什麼也不做。

如果你不是在談論COM,那麼你仍然可以使用COM方式釋放對象。 在C#中保留引用計數並添加C++將調用的C#函數來更新對象。 當ref計數達到零時,C++不再需要這個對象,它可以被丟棄並留給垃圾收集器。

1

不要永遠呼叫delete上的指針,COM對象,該對象引用計數,你應該呼籲COM實例Release()釋放引用計數 - 那麼該對象可以自由內存/資源因爲它看起來合適

+0

我寫了一個測試方法,並試圖看看它是否真的有效。在一個for循環中,我調用了IFoo * mObject = ptrClassFactory-> create(); IFoo->釋放()。但是在一些要點之後,它在發佈方法上崩潰了。對於我的情況下,它崩潰時,我== 300. –

+0

@DavutÖzcan我希望你的意思是mObject-> Release()... – Jonathan

+0

你的代碼中沒有'我',所以我只能引用你到你的調試器,這可能是能夠提供更多的細節*爲什麼*它的失敗(例外等) –