[ http://nagoya.apache.org/jira/browse/XERCESC-1301?page=history ]
Alberto Massari updated XERCESC-1301: ------------------------------------- Assign To: Alberto Massari type: Improvement (was: Bug) Priority: Minor (was: Major) The problem lies in the code you have written: once you use the version of XMLString::transcode that accepts a MemoryManager, you should directly invoke MemoryManager::deallocate to release the string buffer. I am turning this bug into a PCR, so that there will be a version of XMLString::release that accepts a MemoryManager too, and does the right thing. Alberto > XMLString::release uses 'delete' even when MemoryManager is specified in > XMLString::transcode(). > ------------------------------------------------------------------------------------------------ > > Key: XERCESC-1301 > URL: http://nagoya.apache.org/jira/browse/XERCESC-1301 > Project: Xerces-C++ > Type: Improvement > Components: Utilities > Versions: 2.4.0 > Environment: Windows XP, MS Visual C++ 7.0. > Reporter: Kode Charlie > Assignee: Alberto Massari > Priority: Minor > > The problem is this: > 0. Specify a MemoryManager to XMLString::transcode(). > 1. Call XMLString::release() on the XMLCh* you obtained in step (0). > 2. Observe that an exception occurs. > BoundsChecker shows that XMLString::release() is still calling > 'delete' on the XMLCh**, even though we have specified our own > (de)allocation with the MemoryManager. > The code below captures the problem: > class TinyMemoryManager : public MemoryManager { > void *allocate (size_t size) > { > void *retval = malloc (size); > return retval; > } > void deallocate (void *p) > { > free (p); > } > }; > static TinyMemoryManager *s_tmmgr = NULL; > class XStr > { > public : > // ----------------------------------------------------------------------- > // Constructors and Destructor > // ----------------------------------------------------------------------- > XStr(const char* const toTranscode) > { > // Call the private transcoding method > fUnicodeForm = XMLString::transcode (toTranscode, s_tmmgr); > } > ~XStr() > { > XMLString::release(&fUnicodeForm); > } > // ----------------------------------------------------------------------- > // Getter methods > // ----------------------------------------------------------------------- > const XMLCh* unicodeForm() const > { > return fUnicodeForm; > } > private : > // ----------------------------------------------------------------------- > // Private data members > // > // fUnicodeForm > // This is the Unicode XMLCh format of the string. > // ----------------------------------------------------------------------- > XMLCh* fUnicodeForm; > }; > int main (int argc, char *argv[]) > { > s_tmmgr = new TinyMemoryManager(); > XMLCh *ch = somethingGoesHereThatReturnsAnXMLCh(); > if (XMLString::compareString (ch, X ("root"))) // Fatal exception here. > printf ("matched root\n"); > return 1; > } -- This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: http://nagoya.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]