You are viewing a plain text version of this content. The canonical link for it is here.
Posted to c-dev@xerces.apache.org by plele <le...@hotmail.com> on 2009/11/12 07:33:02 UTC

memory leak using XMLTranscoder


I am using xerces 2.8 in C++ API
I created a function to convert to UTF8

void convertToUTF8(const char* buffer, string &utf8_string)
{
        XMLTranscoder* utf8Transcoder; 
        XMLTransService::Codes failReason; 
        utf8Transcoder =
XMLPlatformUtils::fgTransService->makeNewTranscoderFor("UTF-8", failReason,
16*1024); 
        size_t len = XMLString::stringLen(buffer); 
        XMLByte* utf8 = new XMLByte[(len*MB_LEN_MAX)+1]; 
        unsigned int eaten; 
        unsigned int utf8Len = utf8Transcoder->transcodeTo(X(buffer), len,
utf8, len*MB_LEN_MAX, eaten, XMLTranscoder::UnRep_Throw); 
        utf8[utf8Len] = '\0'; 
        utf8_string = (char*)utf8; 
        delete[] utf8;
        delete utf8Transcoder;
}

But this function leaks memory when I pass it through the Purify tool to
detect memory leaks.

[I] MPK: Potential memory leak of 4164 bytes from 214 blocks allocated in
xercesc_2_8::MemoryManagerImpl::allocate(UINT) [XERCES-C_2_8D.DLL]
        Offset 0x00000008 referenced by 0x122cfd54, a location in a section
in a loaded module
        Distribution of potentially leaked blocks
        Allocation location
            new(UINT)     
[f:\sp\vctools\crt_bld\self_x86\crt\src\new.cpp:57]
            xercesc_2_8::MemoryManagerImpl::allocate(UINT)
[F:\WORKDIR\MYPARSER\DEBUG\XERCES-C_2_8D.DLL]


Is there something I need to do explicity to release the memory?
Please let me know.

Thanks
PL

-- 
View this message in context: http://old.nabble.com/memory-leak-using-XMLTranscoder-tp26314147p26314147.html
Sent from the Xerces - C - Dev mailing list archive at Nabble.com.


---------------------------------------------------------------------
To unsubscribe, e-mail: c-dev-unsubscribe@xerces.apache.org
For additional commands, e-mail: c-dev-help@xerces.apache.org


Re: memory leak using XMLTranscoder

Posted by plele <le...@hotmail.com>.
OK Got the problem
I was not calling XMLPlatformUtils::Terminate(); at the end of my program.
The misleading error of memory caused the confusion.
Now the Purifier does not show any leak.

Thanks


Alberto Massari wrote:
> 
> You don't say how the macro X() is implemented; also, beware that you 
> are putting in "len" the ASCII length of the string, and that could be 
> different from the the UTF-16 length.
> The correct code would involve two transcoders, one from the encoding 
> you know is used for the "buffer" variable to Unicode, and one from 
> Unicode to UTF-8.
> 
> Alberto
> 
> plele wrote:
>> I am using xerces 2.8 in C++ API
>> I created a function to convert to UTF8
>>
>> void convertToUTF8(const char* buffer, string &utf8_string)
>> {
>>         XMLTranscoder* utf8Transcoder; 
>>         XMLTransService::Codes failReason; 
>>         utf8Transcoder =
>> XMLPlatformUtils::fgTransService->makeNewTranscoderFor("UTF-8",
>> failReason,
>> 16*1024); 
>>         size_t len = XMLString::stringLen(buffer); 
>>         XMLByte* utf8 = new XMLByte[(len*MB_LEN_MAX)+1]; 
>>         unsigned int eaten; 
>>         unsigned int utf8Len = utf8Transcoder->transcodeTo(X(buffer),
>> len,
>> utf8, len*MB_LEN_MAX, eaten, XMLTranscoder::UnRep_Throw); 
>>         utf8[utf8Len] = '\0'; 
>>         utf8_string = (char*)utf8; 
>>         delete[] utf8;
>>         delete utf8Transcoder;
>> }
>>
>> But this function leaks memory when I pass it through the Purify tool to
>> detect memory leaks.
>>
>> [I] MPK: Potential memory leak of 4164 bytes from 214 blocks allocated in
>> xercesc_2_8::MemoryManagerImpl::allocate(UINT) [XERCES-C_2_8D.DLL]
>>         Offset 0x00000008 referenced by 0x122cfd54, a location in a
>> section
>> in a loaded module
>>         Distribution of potentially leaked blocks
>>         Allocation location
>>             new(UINT)     
>> [f:\sp\vctools\crt_bld\self_x86\crt\src\new.cpp:57]
>>             xercesc_2_8::MemoryManagerImpl::allocate(UINT)
>> [F:\WORKDIR\MYPARSER\DEBUG\XERCES-C_2_8D.DLL]
>>
>>
>> Is there something I need to do explicity to release the memory?
>> Please let me know.
>>
>> Thanks
>> PL
>>
>>   
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: c-dev-unsubscribe@xerces.apache.org
> For additional commands, e-mail: c-dev-help@xerces.apache.org
> 
> 
> 

-- 
View this message in context: http://old.nabble.com/memory-leak-using-XMLTranscoder-tp26314147p26315067.html
Sent from the Xerces - C - Dev mailing list archive at Nabble.com.


---------------------------------------------------------------------
To unsubscribe, e-mail: c-dev-unsubscribe@xerces.apache.org
For additional commands, e-mail: c-dev-help@xerces.apache.org


Re: memory leak using XMLTranscoder

Posted by Alberto Massari <am...@datadirect.com>.
You don't say how the macro X() is implemented; also, beware that you 
are putting in "len" the ASCII length of the string, and that could be 
different from the the UTF-16 length.
The correct code would involve two transcoders, one from the encoding 
you know is used for the "buffer" variable to Unicode, and one from 
Unicode to UTF-8.

Alberto

plele wrote:
> I am using xerces 2.8 in C++ API
> I created a function to convert to UTF8
>
> void convertToUTF8(const char* buffer, string &utf8_string)
> {
>         XMLTranscoder* utf8Transcoder; 
>         XMLTransService::Codes failReason; 
>         utf8Transcoder =
> XMLPlatformUtils::fgTransService->makeNewTranscoderFor("UTF-8", failReason,
> 16*1024); 
>         size_t len = XMLString::stringLen(buffer); 
>         XMLByte* utf8 = new XMLByte[(len*MB_LEN_MAX)+1]; 
>         unsigned int eaten; 
>         unsigned int utf8Len = utf8Transcoder->transcodeTo(X(buffer), len,
> utf8, len*MB_LEN_MAX, eaten, XMLTranscoder::UnRep_Throw); 
>         utf8[utf8Len] = '\0'; 
>         utf8_string = (char*)utf8; 
>         delete[] utf8;
>         delete utf8Transcoder;
> }
>
> But this function leaks memory when I pass it through the Purify tool to
> detect memory leaks.
>
> [I] MPK: Potential memory leak of 4164 bytes from 214 blocks allocated in
> xercesc_2_8::MemoryManagerImpl::allocate(UINT) [XERCES-C_2_8D.DLL]
>         Offset 0x00000008 referenced by 0x122cfd54, a location in a section
> in a loaded module
>         Distribution of potentially leaked blocks
>         Allocation location
>             new(UINT)     
> [f:\sp\vctools\crt_bld\self_x86\crt\src\new.cpp:57]
>             xercesc_2_8::MemoryManagerImpl::allocate(UINT)
> [F:\WORKDIR\MYPARSER\DEBUG\XERCES-C_2_8D.DLL]
>
>
> Is there something I need to do explicity to release the memory?
> Please let me know.
>
> Thanks
> PL
>
>   


---------------------------------------------------------------------
To unsubscribe, e-mail: c-dev-unsubscribe@xerces.apache.org
For additional commands, e-mail: c-dev-help@xerces.apache.org