XMLTransService::makeNewTranscoderFor(...) does not have a corresponding method 
to release the memory it allocates. Once a new XMLTranscoder is created, no 
other feasible way to clear up the memory except for calling XMLTranscoder 
destructor explicitly
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

         Key: XERCESC-1334
         URL: http://issues.apache.org/jira/browse/XERCESC-1334
     Project: Xerces-C++
        Type: Improvement
  Components: Utilities  
    Versions: 1.5, 1.5.1, 1.5.2, 1.6.0    
 Environment: WinXP/VC7.1
    Reporter: xuerong tang
    Priority: Critical


a)Problem description: 

Once TransService is used to create a new XMLTranscoder, no other feasible way 
to clear up the memory except for calling XMLTranscoder destructor explicitly. 
The signature of the creation function is as follows:  
XMLTranscoder* XMLTransService::makeNewTranscoderFor

b)Analyzed the problem:

i.The class tree is XMemory --> XMLTranscoder --> XMLUTF8Transcoder. The 
delete/new operators in the base class were overloaded with pluggable memory 
manager (default is Xerces’ MemoryManager class implementation, which currently 
uses global operators ::operator delete, ::operator new in a straightforward 
manner). The function signature is like this:
void* XMemory::operator new(size_t size, MemoryManager* manager)
void XMemory::operator delete(void* p, MemoryManager* manager)

ii.Although the definitions for the above new/delete appeared symmetric, they 
are actually not. In C++, there is a way of calling this overloaded new 
operator using “replacement new” syntax: e.g., new (manager) XMLTranscoder(…), 
which will call the overloaded new operator (do some memory allocation in this 
case) first and then call the class constructor (do some further memory 
allocation in this case). Unfortunately, there is no such a “replacement 
delete” that will “undo” these things automatically. As a result, whenever 
“placement new” was used, for releasing the memory, the destructor should be 
called explicitly first, then the overloaded delete should be called (so that 
the corresponding memory manager is used) to free up the memory. See BJARNE’s 
C++ Programming Language (3rd Edition) Page 256 for detailed explanation.

iii.Debugging into method makeNewTranscoderFor(…) reveals that it called 
“replacement new” to do the memory allocation:

template <class TType> XMLTranscoder*
ENameMapFor<TType>::makeNew(const unsigned int blockSize,
                            MemoryManager* const manager) const
{
    return new (manager) TType(getKey(), blockSize, manager);
}

but it seemed to me that Xerces did not provide a corresponding method to 
release&clean up objects (at lease in current releases 2.5.0 and 2.6.0)

iv.Without a corresponding destroyTranscoder(...) to hide the detail of 
releasing the memory for me, I have to use the following “messy” code:

//create a new transcoder
XMLTranscoder* aTranscoder =  XMLPlatformUtils::fgTransService->
     makeNewTranscoderFor(encodingName, resCode, 16*maxBufferSize, 
          XMLPlatformUtils::fgMemoryManager);

//do some work with the transcoder
...

//messy code for releasing all the memory
aTranscoder->~XMLTranscoder(); //release the memory allocated in constructor
aTranscoder->operator delete(aTranscoder, XMLPlatformUtils::fgMemoryManager); 
//release the memory allocated by replacment new

c) Proposed improvement

XMLTransService should provide a corresponding DestroyTranscoder(...) method 
that will internally call the above two lines of code so that the 
implementation detail is hidden to the Xerces users.



-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
If you want more information on JIRA, or have a bug to report see:
   http://www.atlassian.com/software/jira


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to