RE: Destruction of ArrayBean -- Memory Leak?

2006-08-09 Thread Kelly, Niall
Title: RE: Destruction of ArrayBean -- Memory Leak?





Hi,


As a follow-up to yesterday's mail, I've created a new issue on JIRA in relation to the client-side memory leak.


http://issues.apache.org/jira/browse/AXISCPP-989


Regards,
Niall.


-Original Message-
From: Kelly, Niall [mailto:[EMAIL PROTECTED]] 
Sent: Tuesday, August 08, 2006 6:07 PM
To: 'axis-c-user@ws.apache.org'
Cc: '[EMAIL PROTECTED]'; '[EMAIL PROTECTED]'
Subject: Re: Destruction of ArrayBean -- Memory Leak?



Hi, 
I have encountered memory leaks (reported by Purify (on Solaris) and Valgrind (on Linux)) in an AXIS C++ Client application. The leaks are associated with a clone of an array object (created by the SoapSerializer::addOutputCmplxArrayParam method). The cloned object is used to call makeArrayBean after which the clone is de-coupled -- i.e its internal m_Size and m_Array fields are reset before it is destroyed. I understand that the idea of this is that the clone object itself is cleaned up and the ArrayBean object takes ownership of the internal array.

After the Web-service operation has been invoked, the ArrayBean destructor will eventually be called. In the destructor a number of checks are made (see below) before the appropriate delete-function (in generated stub) is made. As earlier raised by Yuan Liu, why is this delete function not invoked for client side AXIS C++ apps? (If I remove the check for AxisEngine::m_bServer in the ArrayBean destructor the tools I use no longer report leaks for my application).

Should this change be made to the AXIS C++ source or are there potential issues with allowing this delete on client-side?

Regards, 
Niall. 
 // Extract from ~ArrayBean 
 if (USER_TYPE == m_type) 
 { 
 if (m_value.cta) 
 { 
 if (m_value.cta-pObject) 
 { 
 if (AxisEngine::m_bServer) 
 { 
 m_value.cta-pDelFunct(m_value.cta-pObject, true, m_nSize); 
 } 
 // make sure that the ComplexObjectHandler's destructor does 
 // not try to delete the objects again 
 m_value.cta-pObject = NULL; 
 } 
 delete m_value.cta; 
 m_value.cta = NULL; 
 } 
 } 
 -Original Message- 
 Hi, 
 
 I just want to know is there a reason why ArrayBeans are only deleted on the 
 Server as the destructor contains codes like if (AxisEngine::m_bServer). 
 At the moment, the client is leaking memory whenever it calls 
 addOutputBasicArrayParam (SoapSerializer.cpp) which create an ArrayBean 
 with reference to an allocated block of Axis_Array. The ArrayBean is deleted 
 correctly on server side but client side it is not deleted. 
 
 Thanks for all the good work. 
 
 Regards, 
 
 Yuan Liu 





Re: Destruction of ArrayBean -- Memory Leak?

2006-08-08 Thread Kelly, Niall
Title: Re: Destruction of ArrayBean -- Memory Leak?





Hi,


I have encountered memory leaks (reported by Purify (on Solaris) and Valgrind (on Linux)) in an AXIS C++ Client application. The leaks are associated with a clone of an array object (created by the SoapSerializer::addOutputCmplxArrayParam method). The cloned object is used to call makeArrayBean after which the clone is de-coupled -- i.e its internal m_Size and m_Array fields are reset before it is destroyed. I understand that the idea of this is that the clone object itself is cleaned up and the ArrayBean object takes ownership of the internal array.

After the Web-service operation has been invoked, the ArrayBean destructor will eventually be called. In the destructor a number of checks are made (see below) before the appropriate delete-function (in generated stub) is made. As earlier raised by Yuan Liu, why is this delete function not invoked for client side AXIS C++ apps? (If I remove the check for AxisEngine::m_bServer in the ArrayBean destructor the tools I use no longer report leaks for my application).

Should this change be made to the AXIS C++ source or are there potential issues with allowing this delete on client-side?

Regards,
Niall.


 // Extract from ~ArrayBean
 if (USER_TYPE == m_type)
 {
 if (m_value.cta)
 {
 if (m_value.cta-pObject)
 {
 if (AxisEngine::m_bServer)
 {
 m_value.cta-pDelFunct(m_value.cta-pObject, true, m_nSize);
 }
 // make sure that the ComplexObjectHandler's destructor does 
 // not try to delete the objects again 
 m_value.cta-pObject = NULL;
 }
 delete m_value.cta;
 m_value.cta = NULL;
 }
 }


 -Original Message-


 Hi,
 
 I just want to know is there a reason why ArrayBeans are only deleted on the
 Server as the destructor contains codes like if (AxisEngine::m_bServer).
 At the moment, the client is leaking memory whenever it calls
 addOutputBasicArrayParam (SoapSerializer.cpp) which create an ArrayBean
 with reference to an allocated block of Axis_Array. The ArrayBean is deleted
 correctly on server side but client side it is not deleted.
 
 Thanks for all the good work.
 
 Regards,
 
 Yuan Liu