Re: memory leak when use _com_ptr_t Options
On 8 Dez., 17:17, Life as I know it <82sux...@gmail.com> wrote:
I wrote a class to use C# com in C++ project, but everytime i new A()
and delete A; it will cause memory leak the memeory increase but no
return.
i have debuged into the _com_ptr_t::release function when i call
delete A but from the memory check tool the memory doesn't returned.
#import ".....\bridge.tlb"
class A
{
A();
~A();
Func1();
m_Ptr;
}
A()
{
m_Ptr = NULL;
Bridge::_ObjPtr obj(__uuidof(Bridge::Obj));
m_Ptr = (void *) obj.Detach();
}
~A()
{
Bridge::_ObjPtr obj;
obj.Attach((Bridge::_ObjPtr *)m_Ptr );
}
Func1()
{
Bridge::_ObjPtr obj;
obj.Attach((Bridge::_ObjPtr *)m_Ptr );
...
obj.function();//do someing with the obj
...
obj.Detach();
}
Is anybody have any ideas? what's wrong with me code?
Almost everything is wrong with your code. Let's go through it one by
one:
class A
{
A();
~A();
Func1();
m_Ptr;
}
This won't compile. Please post only complete (compilable) examples.
For the rest of the post I assume that m_Ptr is some flavour of
_com_ptr_t.
A()
{
m_Ptr = NULL;
That's not an error, but you don't need to set _com_ptr_t to NULL,
it's constructor will do that automatically.
Bridge::_ObjPtr obj(__uuidof(Bridge::Obj));
m_Ptr = (void *) obj.Detach();
I assume that Bridge::_ObjPtr is also a _com_ptr_t. In that case you
have your first error:
The variable obj holds one reference count to the newly created object
of the CoClass Bridge::Obj. If you Detach() this pointer, and assign
it to another _com_ptr_t, the assigned _com_ptr_t object will
nevertheless increase the reference count. This way you only one
_com_ptr_t, that holds a reference (when you call Detach on
_com_ptr_t, the smart pointer no longer holds the reference count),
but the reference count of your object is two!
}
~A()
{
Bridge::_ObjPtr obj;
obj.Attach((Bridge::_ObjPtr *)m_Ptr );
That's probably an attempt to compensate for the leaking reference
count of the contructor. Note that if you use smart pointers, you
don't have to write _any_ code in the destructor of the class that
uses the smart pointer for releasing the reference.
}
Func1()
{
Bridge::_ObjPtr obj;
obj.Attach((Bridge::_ObjPtr *)m_Ptr );
...
obj.function();//do someing with the obj
...
obj.Detach();
You must no call Detach on the smart pointer, or else you'll get a
"reference leak". As a good rule of thumb you should never call Attach
or Release on smart pointers (except when you try to do deep
optimizationsor).
Your code should look like this:
class A
{
A();
// No need for destructor
void Func1();
_com_ptr_t<ISomeInterface> m_Ptr;
}
A()
{
HRESULT hr = m_Ptr.CreateInstance (__uuidof(Bridge::Obj));
// TODO: error handling for failures of CreateInstance.
}
void Func1()
{
Bridge::_ObjPtr obj;
obj.function();//do someing with the obj
}
Regards,
Stuart