Thank you. I did dig up the source code (I shouldn't have to do that, but
whatever). Moving my delete[] after parse() seems to have done the trick.
On Fri, Jan 13, 2017 at 9:02 AM, Vitaly Prapirny <m...@mebius.net> wrote:
> Hi Kelly,
>
> This is the implementation:
> void MemBufInputSource::resetMemBufInputSource(const XMLByte* const
> srcDocBytes
> , const XMLSize_t
> byteCount)
> {
> fByteCount = byteCount;
> fSrcBytes = srcDocBytes;
> }
> So answer to your question is:
> No, it doesn't make internal copy of data.
>
> Good luck!
> Vitaly
>
>
>
> Kelly Beard wrote:
>
>> Lets say you have a bit of code that reads characters off of a socket, and
>> you save them to a vector<char>. You call this vector<char> 'big_buf'.
>>
>> You have this code to dump your vector<char> to a char[]:
>>
>> char *DumpVectorToChar(vector<char>& buf)
>> {
>> char *ret_val = 0;
>>
>> int size = buf.size(); // Get vector
>> size
>> vector<char>::iterator buf_end = buf.end(); // Should prevent
>> unnecessary calls to end()
>> if (size > 0) {
>> ret_val = new char[size + 1];
>> if (ret_val != 0) { // Don't assume you got
>> anything
>> int i = 0;
>> for (vector<char>::iterator it = buf.begin(); it != buf_end;
>> ++it) { // Copy vector over
>> ret_val[i++] = *it;
>> }
>> ret_val[i] = '\0'; // null-terminate
>> }
>> }
>>
>> return ret_val; // return ptr to memory or null (unlikely)
>> }
>>
>> somewhere down in your code you have this:
>>
>> if (isComplete) {
>> int size = big_buf.size();
>>
>> // DumpVectorToChar() bolted for failed on new[], so bolt out of
>> here.
>> if (cBuf == 0) {
>> throw runtime_error("XMLSocketApp::doreceive(bool&
>> isComplete,
>> vector<char>& ret_buf) "
>> "MEMORY ALLOCATION ERROR BEFORE FINAL PARSE");
>> }
>>
>> m_memBufIS->resetMemBufInputSource((const XMLByte *)cBuf, size);
>> delete [] cBuf;
>>
>> if (m_defaultHandler != 0) {
>> m_parser->setContentHandler(m_defaultHandler);
>> }
>> if (m_errorHandler != 0) {
>> m_parser->setErrorHandler(m_errorHandler);
>> }
>> m_parser->parse(*m_memBufIS);
>> }
>>
>> You have a program that calls this routine. It crashes, but not all of
>> the
>> time. It does crash when you have your debug flag set to no (of course),
>> works fine when it is on. You know this is a sign of a pointer problem.
>> So, on a hunch and with prayer beads in tow, you do this:
>>
>> if (isComplete) {
>> int size = big_buf.size();
>>
>> // DumpVectorToChar() bolted for failed on new[], so bolt out of
>> here.
>> if (cBuf == 0) {
>> throw runtime_error("XMLSocketApp::doreceive(bool&
>> isComplete,
>> vector<char>& ret_buf) "
>> "MEMORY ALLOCATION ERROR BEFORE FINAL PARSE");
>> }
>>
>> m_memBufIS->resetMemBufInputSource((const XMLByte *)cBuf, size);
>>
>> if (m_defaultHandler != 0) {
>> m_parser->setContentHandler(m_defaultHandler);
>> }
>> if (m_errorHandler != 0) {
>> m_parser->setErrorHandler(m_errorHandler);
>> }
>> m_parser->parse(*m_memBufIS);
>> delete [] cBuf;
>> }
>>
>> See if you can spot the difference. :-)
>>
>> I was under the impression that resetMemBufInputSource() would make its
>> own
>> internal copy of the buffer passed to it. True? I generally find the
>> documentation for Xerces is lacking in these little detail member
>> routines.
>>
>>
>
--
Kelly Beard