digitalmars.D.learn - COM objects
- JC (38/38) Oct 05 2006 When newing a class derived from IUnknown, the compiler recognises it as...
When newing a class derived from IUnknown, the compiler recognises it as a COM object and calls std.c.stdlib.malloc instead of allocating from the GC. It also skips registering a finalizer, so the destructor never gets called on COM objects. Yet I see nothing that frees that memory, so COM objects must be leaking all over the show. In C++, one might go about it like this (actually a smart pointer would be preferable): class COMObject : public IUnknown { LONG ref_; public: COMObject() : ref_(0) { AddRef(); } ULONG __stdcall AddRef() { return InterlockedIncrement(&ref_); } ULONG __stdcall Release() { LONG rc = InterlockedDecrement(&ref_); if (rc == 0) { delete this; return 0; } return ref_; } HRESULT __stdcall QueryInterface(REFIID riid, void** ppvObject) { // QI stuff omitted if (*ppvObject != 0) AddRef(); return S_OK; } }; COMObject* obj = new COMObject; obj->Release(); The D version should be much the same, but calling delete has no effect on non-GC resources. Calling std.c.stdlib.free when the ref count gets to zero would appear to be the solution, but I've found that to cause access violations in a lot of cases. Has anyone figured out a reliable way to do this?
Oct 05 2006